Seven-sided dice from five-sided dice: Difference between revisions
Content added Content deleted
Alextretyak (talk | contribs) (Added 11l) |
|||
Line 1,345: | Line 1,345: | ||
->Expected: 142857., Generated :{142206,142590,142650,142693,142730,143475,143656} |
->Expected: 142857., Generated :{142206,142590,142650,142693,142730,143475,143656} |
||
->"Flat"</pre> |
->"Flat"</pre> |
||
=={{header|Nim}}== |
|||
We use the distribution checker from task [[Simple Random Distribution Checker#Nim|Simple Random Distribution Checker]]. |
|||
<lang Nim>import random, tables |
|||
proc dice5(): int = rand(1..5) |
|||
proc dice7(): int = |
|||
while true: |
|||
let val = 5 * dice5() + dice5() - 6 |
|||
if val < 21: |
|||
return val div 3 + 1 |
|||
proc checkDist(f: proc(): int; repeat: Positive; tolerance: float) = |
|||
var counts: CountTable[int] |
|||
for _ in 1..repeat: |
|||
counts.inc f() |
|||
let expected = (repeat / counts.len).toInt # Rounded to nearest. |
|||
let allowedDelta = (expected.toFloat * tolerance / 100).toInt |
|||
var maxDelta = 0 |
|||
for val, count in counts.pairs: |
|||
let d = abs(count - expected) |
|||
if d > maxDelta: maxDelta = d |
|||
let status = if maxDelta <= allowedDelta: "passed" else: "failed" |
|||
echo "Checking with a tolerance of ", tolerance, "%." |
|||
echo "Random generator ", status, " the uniformity test." |
|||
echo "Max delta = ", maxDelta, " Allowed delta = ", allowedDelta |
|||
when isMainModule: |
|||
import random |
|||
randomize() |
|||
checkDist(dice7, 1_000_000, 0.5)</lang> |
|||
{{out}} |
|||
<pre>Checking with a tolerance of 0.5%. |
|||
Random generator passed the uniformity test. |
|||
Max delta = 559 Allowed delta = 714</pre> |
|||
=={{header|OCaml}}== |
=={{header|OCaml}}== |