以下是从1到45范围内的号码乐透模拟的必要解决方案,每当我们产生一个数字n1时,号码从可能的集合中移除数字。斯卡拉:模拟乐透号码发生器范围1至45
是否有可能以更实用的方式实现相同?即使用图,过滤器等
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
}
“编辑”
一个例子挑3号从范围1到5
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}
各洗牌随机化一组不同的! =>不同的概率
我希望看到一个功能性的“方法”,5个洗牌不是1洗牌!
对不起,但不同的排序影响不成立的可能性的假设。功能解决方案与您在统计基本书中所描述的一样。您的额外限制或模拟将模拟绘图的行为,但不足以形成真正的功能解决方案。 – 2015-03-13 22:16:15
不是订单,大小不一样,每次洗牌后减少一次 – firephil 2015-03-13 22:21:47