enable tests for random (#16297)
This commit is contained in:
parent
82bb4db4b7
commit
73299b048f
1 changed files with 40 additions and 33 deletions
|
|
@ -1,59 +1,66 @@
|
||||||
discard """
|
discard """
|
||||||
action: compile
|
joinable: false
|
||||||
|
targets: "c js"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import random
|
import std/[random, stats]
|
||||||
|
|
||||||
|
randomize(233)
|
||||||
|
|
||||||
proc main =
|
proc main =
|
||||||
var occur: array[1000, int]
|
var occur: array[1000, int]
|
||||||
|
|
||||||
var x = 8234
|
|
||||||
for i in 0..100_000:
|
for i in 0..100_000:
|
||||||
x = rand(high(occur))
|
let x = rand(high(occur))
|
||||||
inc occur[x]
|
inc occur[x]
|
||||||
for i, oc in occur:
|
|
||||||
if oc < 69:
|
|
||||||
doAssert false, "too few occurrences of " & $i
|
|
||||||
elif oc > 150:
|
|
||||||
doAssert false, "too many occurrences of " & $i
|
|
||||||
|
|
||||||
when false:
|
doAssert max(occur) <= 140 and min(occur) >= 60 # gives some slack
|
||||||
var rs: RunningStat
|
|
||||||
for j in 1..5:
|
|
||||||
for i in 1 .. 1_000:
|
|
||||||
rs.push(gauss())
|
|
||||||
echo("mean: ", rs.mean,
|
|
||||||
" stdDev: ", rs.standardDeviation(),
|
|
||||||
" min: ", rs.min,
|
|
||||||
" max: ", rs.max)
|
|
||||||
rs.clear()
|
|
||||||
|
|
||||||
var a = [0, 1]
|
var a = [0, 1]
|
||||||
shuffle(a)
|
shuffle(a)
|
||||||
doAssert a[0] == 1
|
doAssert a in [[0,1], [1,0]]
|
||||||
doAssert a[1] == 0
|
|
||||||
|
|
||||||
doAssert rand(0) == 0
|
doAssert rand(0) == 0
|
||||||
doAssert sample("a") == 'a'
|
doAssert sample("a") == 'a'
|
||||||
|
|
||||||
when compileOption("rangeChecks"):
|
when compileOption("rangeChecks"):
|
||||||
try:
|
doAssertRaises(RangeDefect):
|
||||||
discard rand(-1)
|
discard rand(-1)
|
||||||
doAssert false
|
|
||||||
except RangeDefect:
|
|
||||||
discard
|
|
||||||
|
|
||||||
try:
|
doAssertRaises(RangeDefect):
|
||||||
discard rand(-1.0)
|
discard rand(-1.0)
|
||||||
doAssert false
|
|
||||||
except RangeDefect:
|
|
||||||
discard
|
|
||||||
|
|
||||||
|
|
||||||
# don't use causes integer overflow
|
# don't use causes integer overflow
|
||||||
doAssert compiles(rand[int](low(int) .. high(int)))
|
doAssert compiles(rand[int](low(int) .. high(int)))
|
||||||
|
|
||||||
randomize(223)
|
|
||||||
|
|
||||||
for i in 0 .. 10:
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
block:
|
||||||
|
when not defined(js):
|
||||||
|
doAssert almostEqual(rand(12.5), 4.012897747078944)
|
||||||
|
doAssert almostEqual(rand(2233.3322), 879.702755321298)
|
||||||
|
|
||||||
|
type DiceRoll = range[0..6]
|
||||||
|
doAssert rand(DiceRoll).int == 4
|
||||||
|
|
||||||
|
var rs: RunningStat
|
||||||
|
for j in 1..5:
|
||||||
|
for i in 1 .. 100_000:
|
||||||
|
rs.push(gauss())
|
||||||
|
doAssert abs(rs.mean-0) < 0.08, $rs.mean
|
||||||
|
doAssert abs(rs.standardDeviation()-1.0) < 0.1
|
||||||
|
let bounds = [3.5, 5.0]
|
||||||
|
for a in [rs.max, -rs.min]:
|
||||||
|
doAssert a >= bounds[0] and a <= bounds[1]
|
||||||
|
rs.clear()
|
||||||
|
|
||||||
|
block:
|
||||||
|
type DiceRoll = range[3..6]
|
||||||
|
var flag = false
|
||||||
|
for i in 0..<100:
|
||||||
|
if rand(5.DiceRoll) < 3:
|
||||||
|
flag = true
|
||||||
|
doAssert flag # because of: rand(max: int): int
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue