Seven-sided dice from five-sided dice: Difference between revisions

Content added Content deleted
(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}}==