30 lines
630 B
Nim
30 lines
630 B
Nim
import random
|
|
|
|
func sOfNCreator[T](n: Positive): proc(item: T): seq[T] =
|
|
var sample = newSeqOfCap[T](n)
|
|
var i = 0
|
|
|
|
result = proc(item: T): seq[T] =
|
|
inc i
|
|
if i <= n:
|
|
sample.add(item)
|
|
elif rand(1..i) <= n:
|
|
sample[rand(n - 1)] = item
|
|
sample
|
|
|
|
when isMainModule:
|
|
|
|
randomize()
|
|
|
|
echo "Digits counts for 100_000 runs:"
|
|
var hist: array[10, Natural]
|
|
for _ in 1..100_000:
|
|
let sOfN = sOfNCreator[Natural](3)
|
|
for i in 0..8:
|
|
discard sOfN(i)
|
|
for val in sOfN(9):
|
|
inc hist[val]
|
|
|
|
for n, count in hist:
|
|
echo n, ": ", count
|