Unbias a random generator

func randN (n) {
    n.rand / (n-1) -> int
}
 
func unbiased(n) {
    var n1 = nil
    do { n1 = randN(n) } while (n1 == randN(n))
    return n1
}
 
var iterations = 1000
 
for n in (3..6) {
    var raw = []
    var fixed = []
    iterations.times {
          raw[    randN(n):= 0 ++
        fixed[ unbiased(n):= 0 ++
    }
    printf("N=%d   randN: %s, %4.1f%%   unbiased: %s, %4.1f%%\n",
        n, [raw, fixed].map {|a| (a.dump, a[1] * 100 / iterations) }...)
}

Output:

Last updated

Was this helpful?