स्काला
मुझे पता है कि मेरे उपयोगकर्ता संदेह करेंगे, इसलिए मैंने एक सबूत शामिल किया है कि मेरी यादृच्छिकता वास्तव में उचित है!
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 बना देगा।