diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2020-12-07 23:38:13 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-07 16:38:13 +0100 |
commit | 71e2a9e569ab3380fd057e4fc16e6d4ccd66f1f4 (patch) | |
tree | 2825b41b2d35d9c3a481bbf285a43b621d17e8f5 | |
parent | 94bb816de35953674a3895999838fc67169f8310 (diff) | |
download | Nim-71e2a9e569ab3380fd057e4fc16e6d4ccd66f1f4.tar.gz |
use generics in random (#16283)
* use generics in random * fix
-rw-r--r-- | lib/pure/random.nim | 48 |
1 files changed, 15 insertions, 33 deletions
diff --git a/lib/pure/random.nim b/lib/pure/random.nim index 683140cd8..0ee75e027 100644 --- a/lib/pure/random.nim +++ b/lib/pure/random.nim @@ -217,8 +217,7 @@ proc rand*(r: var Rand; max: Natural): int {.benign.} = ## Returns a random integer in the range `0..max` using the given state. ## ## See also: - ## * `rand proc<#rand,int>`_ that returns an integer using the default - ## random number generator + ## * `rand proc<#rand,T>`_ `T` are integers, floats, and enums without holes. ## * `rand proc<#rand,Rand,range[]>`_ that returns a float ## * `rand proc<#rand,Rand,HSlice[T,T]>`_ that accepts a slice ## * `rand proc<#rand,typedesc[T]>`_ that accepts an integer or range type @@ -233,28 +232,6 @@ proc rand*(r: var Rand; max: Natural): int {.benign.} = if x <= randMax - (randMax mod Ui(max)): return int(x mod (uint64(max)+1u64)) -proc rand*(max: int): int {.benign.} = - ## Returns a random integer in the range `0..max`. - ## - ## If `randomize<#randomize>`_ has not been called, the sequence of random - ## numbers returned from this proc will always be the same. - ## - ## This proc uses the default random number generator. Thus, it is **not** - ## thread-safe. - ## - ## See also: - ## * `rand proc<#rand,Rand,Natural>`_ that returns an integer using a - ## provided state - ## * `rand proc<#rand,float>`_ that returns a float - ## * `rand proc<#rand,HSlice[T,T]>`_ that accepts a slice - ## * `rand proc<#rand,typedesc[T]>`_ that accepts an integer or range type - runnableExamples: - randomize(123) - doAssert rand(100) == 0 - doAssert rand(100) == 96 - doAssert rand(100) == 66 - rand(state, max) - proc rand*(r: var Rand; max: range[0.0 .. high(float)]): float {.benign.} = ## Returns a random floating point number in the range `0.0..max` ## using the given state. @@ -276,8 +253,10 @@ proc rand*(r: var Rand; max: range[0.0 .. high(float)]): float {.benign.} = let u = (0x3FFu64 shl 52u64) or (x shr 12u64) result = (cast[float](u) - 1.0) * max -proc rand*(max: float): float {.benign.} = - ## Returns a random floating point number in the range `0.0..max`. +proc rand*[T: Ordinal or SomeFloat](max: T): T {.benign.} = + ## Returns a random floating point number in the range `T(0) .. max`. + ## + ## Allowed types for `T` are integers, floats, and enums without holes. ## ## If `randomize<#randomize>`_ has not been called, the sequence of random ## numbers returned from this proc will always be the same. @@ -286,16 +265,21 @@ proc rand*(max: float): float {.benign.} = ## thread-safe. ## ## See also: + ## * `rand proc<#rand,Rand,Natural>`_ that returns an integer using a + ## provided state ## * `rand proc<#rand,Rand,range[]>`_ that returns a float using a ## provided state - ## * `rand proc<#rand,int>`_ that returns an integer ## * `rand proc<#rand,HSlice[T,T]>`_ that accepts a slice ## * `rand proc<#rand,typedesc[T]>`_ that accepts an integer or range type runnableExamples: - randomize(234) + randomize(123) + doAssert rand(100) == 0 + doAssert rand(100) == 96 + doAssert rand(100) == 66 + let f = rand(1.0) ## f = 8.717181376738381e-07 - rand(state, max) + result = T(rand(state, max)) proc rand*[T: Ordinal or SomeFloat](r: var Rand; x: HSlice[T, T]): T = ## For a slice `a..b`, returns a value in the range `a..b` using the given @@ -335,8 +319,7 @@ proc rand*[T: Ordinal or SomeFloat](x: HSlice[T, T]): T = ## See also: ## * `rand proc<#rand,Rand,HSlice[T,T]>`_ that accepts a slice and uses ## a provided state - ## * `rand proc<#rand,int>`_ that returns an integer - ## * `rand proc<#rand,float>`_ that returns a floating point number + ## * `rand proc<#rand,T>`_ `T` are integers, floats, and enums without holes. ## * `rand proc<#rand,typedesc[T]>`_ that accepts an integer or range type runnableExamples: randomize(345) @@ -355,8 +338,7 @@ proc rand*[T: SomeInteger](t: typedesc[T]): T = ## thread-safe. ## ## See also: - ## * `rand proc<#rand,int>`_ that returns an integer - ## * `rand proc<#rand,float>`_ that returns a floating point number + ## * `rand proc<#rand,T>`_ `T` are integers, floats, and enums without holes. ## * `rand proc<#rand,HSlice[T,T]>`_ that accepts a slice runnableExamples: randomize(567) |