mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 03:02:31 +00:00
Merge pull request #2908 from apense/patch-7
Updated random functions. Fixes #2907
This commit is contained in:
@@ -202,28 +202,52 @@ when not defined(JS):
|
||||
## computes x to power raised of y.
|
||||
|
||||
# C procs:
|
||||
proc srand(seed: cint) {.importc: "srand", header: "<stdlib.h>".}
|
||||
proc rand(): cint {.importc: "rand", header: "<stdlib.h>".}
|
||||
when defined(vcc):
|
||||
# The "secure" random, available from Windows XP
|
||||
# https://msdn.microsoft.com/en-us/library/sxtz2fa8.aspx
|
||||
# Present in some variants of MinGW but not enough to justify
|
||||
# `when defined(windows)` yet
|
||||
proc rand_s(val: var cuint) {.importc: "rand_s", header: "<stdlib.h>".}
|
||||
# To behave like the normal version
|
||||
proc rand(): cuint = rand_s(result)
|
||||
else:
|
||||
proc srand(seed: cint) {.importc: "srand", header: "<stdlib.h>".}
|
||||
proc rand(): cint {.importc: "rand", header: "<stdlib.h>".}
|
||||
|
||||
when not defined(windows):
|
||||
proc srand48(seed: clong) {.importc: "srand48", header: "<stdlib.h>".}
|
||||
proc drand48(): float {.importc: "drand48", header: "<stdlib.h>".}
|
||||
proc random(max: float): float =
|
||||
result = drand48() * max
|
||||
when defined(windows):
|
||||
proc random(max: float): float =
|
||||
# we are hardcodeing this because
|
||||
# importcing macros is extremely problematic
|
||||
# and because the value is publicly documented
|
||||
# on MSDN and very unlikely to change
|
||||
const rand_max = 32767
|
||||
result = (float(rand()) / float(rand_max)) * max
|
||||
proc randomize() =
|
||||
randomize(cast[int](epochTime()))
|
||||
|
||||
proc randomize(seed: int) =
|
||||
srand(cint(seed))
|
||||
when declared(srand48): srand48(seed)
|
||||
else:
|
||||
when defined(vcc): # Windows with Visual C
|
||||
proc random(max: float): float =
|
||||
# we are hardcoding this because
|
||||
# importc-ing macros is extremely problematic
|
||||
# and because the value is publicly documented
|
||||
# on MSDN and very unlikely to change
|
||||
# See https://msdn.microsoft.com/en-us/library/296az74e.aspx
|
||||
const rand_max = 4294967295 # UINT_MAX
|
||||
result = (float(rand()) / float(rand_max)) * max
|
||||
proc randomize() = discard
|
||||
proc randomize(seed: int) = discard
|
||||
else: # Windows with another compiler
|
||||
proc random(max: float): float =
|
||||
# we are hardcoding this because
|
||||
# importc-ing macros is extremely problematic
|
||||
# and because the value is publicly documented
|
||||
# on MSDN and very unlikely to change
|
||||
const rand_max = 32767
|
||||
result = (float(rand()) / float(rand_max)) * max
|
||||
|
||||
when not defined(vcc): # the above code for vcc uses `discard` instead
|
||||
# this is either not Windows or is Windows without vcc
|
||||
proc randomize() =
|
||||
randomize(cast[int](epochTime()))
|
||||
proc randomize(seed: int) =
|
||||
srand(cint(seed)) # rand_s doesn't use srand
|
||||
when declared(srand48): srand48(seed)
|
||||
|
||||
proc random(max: int): int =
|
||||
result = int(rand()) mod max
|
||||
|
||||
|
||||
Reference in New Issue
Block a user