Unbias a random generator: Difference between revisions
Content added Content deleted
m (Use more math!) |
(→Tcl: Added implementation) |
||
Line 52: | Line 52: | ||
Biased(6) = Stats(count1=167561, count0=832439, percent=16.7561) |
Biased(6) = Stats(count1=167561, count0=832439, percent=16.7561) |
||
Unbiased = Stats(count1=499963, count0=500037, percent=49.996299999999998)</pre> |
Unbiased = Stats(count1=499963, count0=500037, percent=49.996299999999998)</pre> |
||
=={{header|Tcl}}== |
|||
<lang tcl># 1,0 random generator factory with 1 appearing 1/N'th of the time |
|||
proc randN n {expr {rand()*$n < 1}} |
|||
# uses a biased generator of 1 or 0, to create an unbiased one |
|||
proc unbiased {biased} { |
|||
while 1 { |
|||
if {[set a [eval $biased]] != [eval $biased]} {return $a} |
|||
} |
|||
} |
|||
for {set n 3} {$n <= 6} {incr n} { |
|||
set biased [list randN $n] |
|||
for {set i 0;array set c {0 0 1 0}} {$i < 1000000} {incr i} { |
|||
incr c([eval $biased]) |
|||
} |
|||
puts [format " biased %d => #0=%d #1=%d ratio=%.2f%%" $n $c(0) $c(1) \ |
|||
[expr {100.*$c(1)/$i}]] |
|||
for {set i 0;array set c {0 0 1 0}} {$i < 1000000} {incr i} { |
|||
incr c([unbiased $biased]) |
|||
} |
|||
puts [format "unbiased %d => #0=%d #1=%d ratio=%.2f%%" $n $c(0) $c(1) \ |
|||
[expr {100.*$c(1)/$i}]] |
|||
}</lang> |
|||
Sample output: |
|||
<pre> |
|||
biased 3 => #0=667076 #1=332924 ratio=33.29% |
|||
unbiased 3 => #0=500263 #1=499737 ratio=49.97% |
|||
biased 4 => #0=750470 #1=249530 ratio=24.95% |
|||
unbiased 4 => #0=500644 #1=499356 ratio=49.94% |
|||
biased 5 => #0=800243 #1=199757 ratio=19.98% |
|||
unbiased 5 => #0=500878 #1=499122 ratio=49.91% |
|||
biased 6 => #0=833623 #1=166377 ratio=16.64% |
|||
unbiased 6 => #0=500518 #1=499482 ratio=49.95% |
|||
</pre> |