|
1 | 1 | discard """ |
2 | | - action: compile |
| 2 | + joinable: false |
| 3 | + targets: "c js" |
3 | 4 | """ |
4 | 5 |
|
5 | | -import random |
| 6 | +import std/[random, stats] |
| 7 | + |
| 8 | +randomize(233) |
6 | 9 |
|
7 | 10 | proc main = |
8 | 11 | var occur: array[1000, int] |
9 | 12 |
|
10 | | - var x = 8234 |
11 | 13 | for i in 0..100_000: |
12 | | - x = rand(high(occur)) |
| 14 | + let x = rand(high(occur)) |
13 | 15 | 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 |
30 | 18 |
|
31 | 19 | var a = [0, 1] |
32 | 20 | shuffle(a) |
33 | | - doAssert a[0] == 1 |
34 | | - doAssert a[1] == 0 |
| 21 | + doAssert a in [[0,1], [1,0]] |
35 | 22 |
|
36 | 23 | doAssert rand(0) == 0 |
37 | 24 | doAssert sample("a") == 'a' |
38 | 25 |
|
39 | 26 | when compileOption("rangeChecks"): |
40 | | - try: |
| 27 | + doAssertRaises(RangeDefect): |
41 | 28 | discard rand(-1) |
42 | | - doAssert false |
43 | | - except RangeDefect: |
44 | | - discard |
45 | 29 |
|
46 | | - try: |
| 30 | + doAssertRaises(RangeDefect): |
47 | 31 | discard rand(-1.0) |
48 | | - doAssert false |
49 | | - except RangeDefect: |
50 | | - discard |
51 | | - |
52 | 32 |
|
53 | 33 | # don't use causes integer overflow |
54 | 34 | doAssert compiles(rand[int](low(int) .. high(int))) |
55 | 35 |
|
56 | | -randomize(223) |
57 | 36 |
|
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