Unbias a random generator: Difference between revisions

Updated to work with Nim 1.4: replaced "math" with "random", removed "newSeqWith", added missing parameter types, replaced "random" with "rand". Also changed output using "strformat".
(Added 11l)
(Updated to work with Nim 1.4: replaced "math" with "random", removed "newSeqWith", added missing parameter types, replaced "random" with "rand". Also changed output using "strformat".)
Line 1,256:
=={{header|Nim}}==
{{trans|Python}}
<lang nim>import mathrandom, strutilssequtils, strformat
randomize()
 
proctype randN(n):randProc = (proc: range[0..1]) =
template newSeqWith(len: int, init: expr): expr =
var result {.gensym.} = newSeq[type(init)](len)
for i in 0..<len:
result[i] = init
 
randomize()
proc randN(n): (proc: range[0..1]) =
 
proc: range[0..1] = ord(random(n) == 0)
proc randN(n: Positive): randProc =
result = proc: range[0..1] = ord(randomrand(n) == 0)
 
proc unbiased(biased: randProc): range[0..1] =
result = biased()
var that = biased()
Line 1,279 ⟶ 1,277:
var cnt0, cnt1 = 0
for x in v:
if x == 0: inc cnt0 else: inc cnt1
echo &"Biased(",{n,"}) → count1 = count1=",{cnt1,"}, count0 =", {cnt0,"}, percent = {100*cnt1 / (cnt1+cnt0):.3f}",
else: inc cnt1
echo "Biased(",n,") = count1=",cnt1,", count0=",cnt0,", percent=",
formatFloat(100 * float(cnt1)/float(cnt1+cnt0), ffDecimal, 3)
 
v = newSeqWith(1_000_000, unbiased(biased))
Line 1,288 ⟶ 1,284:
cnt1 = 0
for x in v:
if x == 0: inc cnt0 else: inc cnt1
echo &"Unbiased = count1 =499712 {cnt1}, count0 =500288 {cnt0}, percent =49 {100*cnt1 / (cnt1+cnt0):.9713f}"</prelang>
else: inc cnt1
 
echo " Unbiased = count1=",cnt1,", count0=",cnt0,", percent=",
{{out}}
formatFloat(100 * float(cnt1)/float(cnt1+cnt0), ffDecimal, 3)</lang>
<pre>Biased(3) → count1 = 249654, count0 = 750346, percent = 24.965
Output:
<pre>Biased(3)Unbiased = count1 =332805 498631, count0 =667195 501369, percent =33 49.281863
Biased(4) Unbiasedcount1 = count1=500157200117, count0 =499843 799883, percent =50 20.016012
Biased(4)Unbiased = count1 =249575 499425, count0 =750425 500575, percent =24 49.957943
Biased(5) Unbiasedcount1 = count1=500072167218, count0 =499928 832782, percent =50 16.007722
Biased(5)Unbiased = count1 =199537 500020, count0 =800463 499980, percent =19 50.954002
Biased(6) Unbiasedcount1 = count1=499396143388, count0 =500604 856612, percent =49 14.940339
Biased(6)Unbiased = count1 =166728 500378, count0 =833272 499622, percent =16 50.673038</pre>
Unbiased = count1=499712, count0=500288, percent=49.971</pre>
 
=={{header|OCaml}}==
Anonymous user