summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorAntonis Geralis <43617260+planetis-m@users.noreply.github.com>2022-07-18 22:18:12 +0300
committerGitHub <noreply@github.com>2022-07-18 21:18:12 +0200
commitf34734ffb4c58d6f3ec3d177efcff24f379b41b8 (patch)
tree1fb0f326758d5f7f9676de30e38bf1595764bb94 /lib/pure
parentf2e440730634a4679cb140234eae7c11251349ec (diff)
downloadNim-f34734ffb4c58d6f3ec3d177efcff24f379b41b8.tar.gz
Improve rand(bool) (#20045)
* Improve rand(bool)

* Use sign test instead of mod 2

* Use mod 2 again, as it works for js

* Use right shift as suggested by the authors of xoroshiro

* Update random.nim

* General case doesn't need any right shift it was correct to begin with

* Update random.nim

* add comment

Co-authored-by: flywind <43030857+xflywind@users.noreply.github.com>
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/random.nim6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/pure/random.nim b/lib/pure/random.nim
index 832d54e3d..7676ce6cf 100644
--- a/lib/pure/random.nim
+++ b/lib/pure/random.nim
@@ -377,10 +377,12 @@ proc rand*[T: Ordinal](t: typedesc[T]): T =
       assert rand(range[1..16]) in 1..16
   # pending csources >= 1.4.0 or fixing https://github.com/timotheecour/Nim/issues/251#issuecomment-831599772,
   # use `runnableExamples("-r:off")` instead of `if false`
-  when T is range or T is enum or T is bool:
+  when T is range or T is enum:
     result = rand(state, low(T)..high(T))
+  elif T is bool:
+    result = state.next shr 63 == 1 # sign test, works on js
   else:
-    result = cast[T](state.next)
+    result = cast[T](state.next shr (64 - sizeof(T)*8))
 
 proc sample*[T](r: var Rand; s: set[T]): T =
   ## Returns a random element from the set `s` using the given state.