Skip to content

Commit 789ae0b

Browse files
ringaboutmildred
authored andcommitted
enable tests for random (nim-lang#16297)
1 parent b252f88 commit 789ae0b

File tree

1 file changed

+41
-34
lines changed

1 file changed

+41
-34
lines changed

tests/stdlib/trandom.nim

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,66 @@
11
discard """
2-
action: compile
2+
joinable: false
3+
targets: "c js"
34
"""
45

5-
import random
6+
import std/[random, stats]
7+
8+
randomize(233)
69

710
proc main =
811
var occur: array[1000, int]
912

10-
var x = 8234
1113
for i in 0..100_000:
12-
x = rand(high(occur))
14+
let x = rand(high(occur))
1315
inc occur[x]
14-
for i, oc in occur:
15-
if oc < 69:
16-
doAssert false, "too few occurrences of " & $i
17-
elif oc > 150:
18-
doAssert false, "too many occurrences of " & $i
19-
20-
when false:
21-
var rs: RunningStat
22-
for j in 1..5:
23-
for i in 1 .. 1_000:
24-
rs.push(gauss())
25-
echo("mean: ", rs.mean,
26-
" stdDev: ", rs.standardDeviation(),
27-
" min: ", rs.min,
28-
" max: ", rs.max)
29-
rs.clear()
16+
17+
doAssert max(occur) <= 140 and min(occur) >= 60 # gives some slack
3018

3119
var a = [0, 1]
3220
shuffle(a)
33-
doAssert a[0] == 1
34-
doAssert a[1] == 0
21+
doAssert a in [[0,1], [1,0]]
3522

3623
doAssert rand(0) == 0
3724
doAssert sample("a") == 'a'
3825

3926
when compileOption("rangeChecks"):
40-
try:
27+
doAssertRaises(RangeDefect):
4128
discard rand(-1)
42-
doAssert false
43-
except RangeDefect:
44-
discard
4529

46-
try:
30+
doAssertRaises(RangeDefect):
4731
discard rand(-1.0)
48-
doAssert false
49-
except RangeDefect:
50-
discard
51-
5232

5333
# don't use causes integer overflow
5434
doAssert compiles(rand[int](low(int) .. high(int)))
5535

56-
randomize(223)
5736

58-
for i in 0 .. 10:
59-
main()
37+
main()
38+
39+
import math
40+
41+
block:
42+
when not defined(js):
43+
doAssert almostEqual(rand(12.5), 4.012897747078944)
44+
doAssert almostEqual(rand(2233.3322), 879.702755321298)
45+
46+
type DiceRoll = range[0..6]
47+
doAssert rand(DiceRoll).int == 4
48+
49+
var rs: RunningStat
50+
for j in 1..5:
51+
for i in 1 .. 100_000:
52+
rs.push(gauss())
53+
doAssert abs(rs.mean-0) < 0.08, $rs.mean
54+
doAssert abs(rs.standardDeviation()-1.0) < 0.1
55+
let bounds = [3.5, 5.0]
56+
for a in [rs.max, -rs.min]:
57+
doAssert a >= bounds[0] and a <= bounds[1]
58+
rs.clear()
59+
60+
block:
61+
type DiceRoll = range[3..6]
62+
var flag = false
63+
for i in 0..<100:
64+
if rand(5.DiceRoll) < 3:
65+
flag = true
66+
doAssert flag # because of: rand(max: int): int

0 commit comments

Comments
 (0)