Unbias a random generator: Difference between revisions
Content deleted Content added
use proper range |
Updated D code |
||
Line 292: | Line 292: | ||
<lang d>import std.stdio, std.random; |
<lang d>import std.stdio, std.random; |
||
bool biased(int n) { |
bool biased(in int n) /*nothrow*/ { |
||
return uniform(0.0, 1.0) < (1.0 / n); |
return uniform(0.0, 1.0) < (1.0 / n); |
||
} |
} |
||
bool unbiased(int n) { |
bool unbiased(in int n) /*nothrow*/ { |
||
while (true) { |
|||
immutable bool a = biased(n); |
|||
do { |
|||
a = biased(n) |
if (a != biased(n)) |
||
return a; |
|||
} |
} |
||
return a; |
|||
} |
} |
||
void main() { |
void main() { |
||
int M = |
enum int M = 20_000_000; |
||
foreach (n; 3 .. 7) { |
foreach (n; 3 .. 7) { |
||
int |
int a1, a2; // accumulators |
||
foreach (i; 0 .. M) { |
foreach (i; 0 .. M) { |
||
a1 += biased(n); |
|||
a2 += unbiased(n); |
|||
} |
} |
||
writefln("%d: %2. |
writefln("%d: %2.3f%% %2.3f%%", n, |
||
100.0 * a1 / M, 100.0 * a2 / M); |
|||
} |
} |
||
}</lang> |
}</lang> |
||
Output: |
Output: |
||
<pre>3: 33. |
<pre>3: 33.352% 50.002% |
||
4: 25. |
4: 25.006% 49.989% |
||
5: 19. |
5: 19.995% 49.989% |
||
6: 16. |
6: 16.679% 50.007%</pre> |
||
=={{header|Euphoria}}== |
=={{header|Euphoria}}== |