Skip to content

Commit

Permalink
Add initRand() with seed based on time (#16953)
Browse files Browse the repository at this point in the history
  • Loading branch information
metagn authored Feb 8, 2021
1 parent c548f97 commit 4fac8af
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
2 changes: 2 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ with other backends. see #9125. Use `-d:nimLegacyJsRound` for previous behavior.
(instead of skipping them sometimes as it was before).
- Added optional `followSymlinks` argument to `setFilePermissions`.

- Added `random.initRand()` overload with no argument which uses the current time as a seed.

## Language changes

- `nimscript` now handles `except Exception as e`.
Expand Down
45 changes: 35 additions & 10 deletions lib/pure/random.nim
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,7 @@ proc initRand*(seed: int64): Rand =
## generator's state.
##
## See also:
## * `initRand proc<#initRand>`_ that uses the current time
## * `randomize proc<#randomize,int64>`_ that accepts a seed for the default
## random number generator
## * `randomize proc<#randomize>`_ that initializes the default random
Expand All @@ -589,8 +590,11 @@ proc randomize*(seed: int64) {.benign.} =
## the same results for that seed each time.
##
## See also:
## * `initRand proc<#initRand,int64>`_
## * `initRand proc<#initRand,int64>`_ that initializes a Rand state
## with a given seed
## * `randomize proc<#randomize>`_ that uses the current time instead
## * `initRand proc<#initRand>`_ that initializes a Rand state using
## the current time
runnableExamples:
from times import getTime, toUnix, nanosecond

Expand Down Expand Up @@ -635,25 +639,46 @@ proc shuffle*[T](x: var openArray[T]) =

when not defined(nimscript) and not defined(standalone):
import times

proc initRand(): Rand =
## Initializes a new Rand state with a seed based on the current time.
##
## The resulting state is independent of the default random number generator's state.
##
## **Note:** Does not work for NimScript or the compile-time VM.
##
## See also:
## * `initRand proc<#initRand,int64>`_ that accepts a seed for a new Rand state
## * `randomize proc<#randomize>`_ that initializes the default random
## number generator using the current time
## * `randomize proc<#randomize,int64>`_ that accepts a seed for the default
## random number generator
when defined(js):
let time = int64(times.epochTime() * 1000) and 0x7fff_ffff
result = initRand(time)
else:
let now = times.getTime()
result = initRand(convert(Seconds, Nanoseconds, now.toUnix) + now.nanosecond)

since (1, 5, 1):
export initRand

proc randomize*() {.benign.} =
## Initializes the default random number generator with a value based on
## Initializes the default random number generator with a seed based on
## the current time.
##
## This proc only needs to be called once, and it should be called before
## the first usage of procs from this module that use the default random
## number generator.
##
## **Note:** Does not work for NimScript.
## **Note:** Does not work for NimScript or the compile-time VM.
##
## See also:
## * `randomize proc<#randomize,int64>`_ that accepts a seed
## * `initRand proc<#initRand,int64>`_
when defined(js):
let time = int64(times.epochTime() * 1000) and 0x7fff_ffff
randomize(time)
else:
let now = times.getTime()
randomize(convert(Seconds, Nanoseconds, now.toUnix) + now.nanosecond)
## * `initRand proc<#initRand>`_ that initializes a Rand state using
## the current time
## * `initRand proc<#initRand,int64>`_ that initializes a Rand state
## with a given seed
state = initRand()

{.pop.}

0 comments on commit 4fac8af

Please sign in to comment.