Scala:在范围1到45中模拟乐透号码生成器

fir*_*hil 2 scala scala-collections

以下是从1到45范围内模拟数字彩票的必要解决方案,每次我们生成数字n1时,该数字将从可能的数字集合中删除.

是否有可能以更实用的方式实现相同目标?即使用地图,过滤等

def getNumbers :Array[Int] = {

        val range = 1 to 45
        var set = range.toSet

        var resultSet:Set[Int] = Set()
        var current: Int = 0

        while(resultSet.size <  5 ){
            current = Random.shuffle(set).head // pick the head of the shuffled set
            set -= current
            resultSet += current
        }

        resultSet.toArray
    }
Run Code Online (Sandbox Code Playgroud)

"编辑"

示例从范围1到5中选择3个数字

Original Set is {1,2,3,4,5}
{1,2,3,4,5} shuffle(1) picked at random 3
{1,2,4,5}     shuffle(2) picked at random 2
{1,4,5}       shuffle(3) picked at random 4
original Set becomes {1,5}

numbers picked {3,2,4}
Run Code Online (Sandbox Code Playgroud)

每个shuffle随机化一个不同的SET!=>不同的概率

我希望看到一个功能性的"方法",5次洗牌而不是1次洗牌!

Mic*_*jac 7

当然,这是可能的.集合API拥有您需要的一切.您正在寻找的是take,它将采用n集合的第一个元素,或者如果有少于,则采用与集合相同的元素n.

Random.shuffle(1 to 45).take(5).toArray
Run Code Online (Sandbox Code Playgroud)

  • @firephil你是什么意思?该集合不包含重复项,因此不可能两次选择相同的元素. (3认同)
  • 数字*是*在这里取出.您不能两次选择相同的数字.唯一的区别是,我不是一次取出五个数字,而是一次取出五个数字.真的,没有什么不同. (3认同)