enable tests for random (#16297)

This commit is contained in:
flywind
2020-12-10 14:58:42 +08:00
committed by GitHub
parent 82bb4db4b7
commit 73299b048f

View File

@@ -1,59 +1,66 @@
discard """
action: compile
joinable: false
targets: "c js"
"""
import random
import std/[random, stats]
randomize(233)
proc main =
var occur: array[1000, int]
var x = 8234
for i in 0..100_000:
x = rand(high(occur))
let x = rand(high(occur))
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:
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()
doAssert max(occur) <= 140 and min(occur) >= 60 # gives some slack
var a = [0, 1]
shuffle(a)
doAssert a[0] == 1
doAssert a[1] == 0
doAssert a in [[0,1], [1,0]]
doAssert rand(0) == 0
doAssert sample("a") == 'a'
when compileOption("rangeChecks"):
try:
doAssertRaises(RangeDefect):
discard rand(-1)
doAssert false
except RangeDefect:
discard
try:
doAssertRaises(RangeDefect):
discard rand(-1.0)
doAssert false
except RangeDefect:
discard
# don't use causes integer overflow
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