Random.nextInt 似乎没有应有的随机性

1 java random scala

这是我的功能:

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))
  }
}
Run Code Online (Sandbox Code Playgroud)

我有十个这样的测试:

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

Run Code Online (Sandbox Code Playgroud)

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

And*_*ner 6

根据生日悖论,尽管事实上可能有 365 种不同的生日,但一个房间里只需要大约 23 个人,就有 50% 的机会其中 2 人共享同一生日。

这与您的代码相同:您有 10,000,000 个不同的可能值,但如果您将多个值放入~sqrt(10,000,000) ~= 3162一个容器中,则其中两个相同的可能性 >50%。

您只在容器中放入 1000 个,因此发生碰撞的可能性不是 50%,但仍然相当高。