choice.nim
March 22, 2015 ยท View on GitHub
import mersenne, tables, sequtils, algorithm
var rng = newMersenneTwister(1)
proc random(m: int): int = rng.getNum mod m
proc randomChoice(k, n: int): seq[int] =
Fisher-Yates with a hash table.
result = @[] var work = initTableint, int for i in countdown(n, n-k+1): let r = random(i)+1 if work.hasKey(r): add(result, work[r]) else: add(result, r) work[r] = i sort(result, cmp[int])
var tab = newTableseq[int], int
for i in 1..100000: let t = randomChoice(3, 10) if not tab.hasKey(t): tab[t] = 1 else: tab[t] = tab[t] + 1
echo tab