Random.nextInt 似乎并不像它应该的那样随机



这是我的功能:

private def generateOneThousandRandomNumbers(listOfNumbers: List[String] = List.empty): List[String] = {
if (listOfNumbers.size == 1000) {
listOfNumbers
} else {
val nextNumber: String = Random.nextInt(10000000).toString
if (listOfNumbers.contains(nextNumber)) {
println("DUPLICATE NUMBER GENERATED: " + nextNumber)
}
generateOneThousandRandomNumbers(listOfNumbers ++ List(nextNumber))
}
}

我有十个这样的测试:

"areUnique1" in {
val x = generateOneThousandRandomNumbers()
x.size shouldBe x.distinct.size
}

因此,根据我的计算,对于一个测试,它应该只创建一个重复的1/10,000运行,并且对于10个测试,它应该只创建一个重复的1/1,000运行。然而,它在大约50%的运行中创建了重复,我不确定为什么。

根据生日悖论,一个房间里只要有23个人,其中2个人同一天生日的概率就会达到50%,尽管事实上可能有365个不同的生日。

这与你的代码是一样的:你有10,000,000个不同的可能值,但如果你在一个容器中放入超过~sqrt(10,000,000) ~= 3162个值,那么其中两个值相同的概率将为50%。

你只放了1000个在你的容器里,所以发生碰撞的几率不是50%,但它仍然是相当高的。

最新更新