Unbias a random generator: Difference between revisions
Content added Content deleted
(Smaller equations.) |
(Add Seed7 example) |
||
Line 668: | Line 668: | ||
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|Seed7}}== |
|||
<lang seed7>$ include "seed7_05.s7i"; |
|||
include "float.s7i"; |
|||
const func integer: randN (in integer: n) is |
|||
return ord(rand(1, n) = 1); |
|||
const func integer: unbiased (in integer: n) is func |
|||
result |
|||
var integer: unbiased is 0; |
|||
begin |
|||
repeat |
|||
unbiased := randN(n); |
|||
until unbiased <> randN(n); |
|||
end func; |
|||
const proc: main is func |
|||
local |
|||
const integer: tests is 50000; |
|||
var integer: n is 0; |
|||
var integer: sumBiased is 0; |
|||
var integer: sumUnbiased is 0; |
|||
var integer: count is 0; |
|||
begin |
|||
for n range 3 to 6 do |
|||
sumBiased := 0; |
|||
sumUnbiased := 0; |
|||
for count range 1 to tests do |
|||
sumBiased +:= randN(n); |
|||
sumUnbiased +:= unbiased(n); |
|||
end for; |
|||
writeln(n <& ": " <& flt(sumBiased) / flt(tests) * 100.0 digits 3 lpad 6 <& |
|||
" " <& flt(sumUnbiased) / flt(tests) * 100.0 digits 3 lpad 6); |
|||
end for; |
|||
end func;</lang> |
|||
Output: |
|||
<pre> |
|||
3: 33.004 50.024 |
|||
4: 25.158 50.278 |
|||
5: 20.186 49.978 |
|||
6: 16.570 49.936 |
|||
</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |