สกาล่า
ฉันรู้ว่าผู้ใช้ของฉันจะสงสัยดังนั้นฉันจึงได้รวมหลักฐานว่าการสุ่มของฉันมีความยุติธรรมอย่างแท้จริง!
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
}
}
ตัวอย่างการเรียกใช้:
1 chosen 25.31%
2 chosen 24.46%
3 chosen 24.83%
4 chosen 25.4%
John will buy the drinks this time!
จอห์นจะซื้อเครื่องดื่มทุกครั้งเว้นเสียแต่ว่าคนอื่นจะโชคดีอย่างยิ่ง
"การพิสูจน์" ของการสุ่มขึ้นอยู่กับความจริงที่ว่าrand(1, 4) * rand(1, 4) % 5
ยังคงมีการกระจายอย่างเท่าเทียมกันระหว่าง 1 และ 4 รวม แต่rand(1, 5) * rand(1, 5) % 6
จะเสื่อมสภาพ มีความเป็นไปได้ที่คุณจะได้รับ 0 ซึ่งจะทำให้ผลลัพธ์สุดท้ายเป็น 0 โดยไม่คำนึงถึง "สุ่ม" ที่เหลือ