Scala
Tôi biết người dùng của tôi sẽ nghi ngờ, vì vậy tôi đã đưa ra một bằng chứng cho thấy sự ngẫu nhiên của tôi là thực sự công bằng!
object DrinkChooser {
def main(args: Array[String]): Unit = {
proveRandomness()
val names = List("John","Jeff","Emma","Steve","Julie")
val buyer = names(randomChoice(names.size))
println(s"$buyer will buy the drinks this time!")
}
def proveRandomness(): Unit = {
val trials = 10000
val n = 4
val choices = for (_ <- 1 to 10000) yield randomChoice(n)
(choices groupBy(identity)).toList.sortBy(_._1) foreach { case (a, x) =>
println(a + " chosen " + (x.size * 100.0 / trials) + "%")
}
}
def randomChoice(n: Int): Int = {
var x = 1
for (i <- 1 to 1000) { // don't trust random, add in more randomness!
x = (x * randomInt(1, n)) % (n + 1)
}
x
}
// random int between min and max inclusive
def randomInt(min: Int, max: Int) = {
new scala.util.Random().nextInt(max - min + 1) + min
}
}
Một ví dụ chạy:
1 chosen 25.31%
2 chosen 24.46%
3 chosen 24.83%
4 chosen 25.4%
John will buy the drinks this time!
Trừ khi người khác cực kỳ may mắn, John sẽ luôn mua đồ uống.
"Bằng chứng" về tính ngẫu nhiên phụ thuộc vào thực tế rand(1, 4) * rand(1, 4) % 5
vẫn được phân bổ đều giữa 1 và 4, bao gồm. Nhưng rand(1, 5) * rand(1, 5) % 6
là thoái hóa. Có khả năng bạn nhận được 0, sau đó sẽ đưa ra kết quả cuối cùng 0 bất kể phần còn lại của "tính ngẫu nhiên".