summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorflywind <43030857+xflywind@users.noreply.github.com>2020-12-10 14:58:42 +0800
committerGitHub <noreply@github.com>2020-12-10 07:58:42 +0100
commit73299b048f57838d83a3a8159909386a0905e553 (patch)
tree1347bc7fb546fe7ab2bebee8e7fec8b6d4af461c
parent82bb4db4b72e4ca61e2853755fd8ed8527c1a42a (diff)
downloadNim-73299b048f57838d83a3a8159909386a0905e553.tar.gz
enable tests for random (#16297)
-rw-r--r--tests/stdlib/trandom.nim75
1 files changed, 41 insertions, 34 deletions
diff --git a/tests/stdlib/trandom.nim b/tests/stdlib/trandom.nim
index c7c6a3f56..f8797944e 100644
--- a/tests/stdlib/trandom.nim
+++ b/tests/stdlib/trandom.nim
@@ -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