From b7f164965aa203e043754e35e5336207649dcc51 Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 17:53:13 -0700 Subject: [PATCH 01/18] Add functions to the mersenne module. Add tests for them. I am very inexperienced. --- lib/pure/mersenne.nim | 97 +++++++++++++++++++++++++++++++++++++- tests/stdlib/tmersenne.nim | 7 +++ 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 6778e2d627661..1a82b690999e1 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -19,7 +19,6 @@ runnableExamples: ## See also ## ======== ## * `random module`_ for Nim's standard random number generator - type MersenneTwister* = object ## The Mersenne Twister. @@ -53,3 +52,99 @@ proc getNum*(m: var MersenneTwister): uint32 = result = result xor ((result shl 7'u32) and 0x9d2c5680'u32) result = result xor ((result shl 15'u32) and 0xefc60000'u32) result = result xor (result shr 18'u32) + +proc getSeq*(m: var MersenneTwister, len: int): seq[int] = + ## returns seq of pseudorandom ints len long. + for i in 1..len: + result.add(int(getNum(m))) + ## Might be useful at some point to someone. + + +proc sample*(q: var MersenneTwister, arr: seq[int]): int = + ## take random sample of an seq[int]. + var correspondingvalues: seq[uint32] + var maxVal: uint32 = uint32(4294967295) + let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + for i in arr: + correspondingvalues.add(maxVal) + maxVal = maxVal - maxValdivlenarr + let num = uint32(getNum(q)) + var largenumrindex: uint32 = 0 + var smallernumindex: uint32 = 1 + while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): + if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + result = arr[largenumrindex] + break + elif num < correspondingvalues[correspondingvalues.high]: + result = arr[correspondingvalues.high] + break + largenumrindex = largenumrindex + 1 + smallernumindex = smallernumindex + 1 + + +proc sample*(q: var MersenneTwister, arr: seq[char]): char = + ## take random sample of an seq[char]. + var correspondingvalues: seq[uint32] + var maxVal: uint32 = uint32(4294967295) + let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + for i in arr: + correspondingvalues.add(maxVal) + maxVal = maxVal - maxValdivlenarr + let num = uint32(getNum(q)) + var largenumrindex: uint32 = 0 + var smallernumindex: uint32 = 1 + while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): + if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + result = arr[largenumrindex] + break + elif num < correspondingvalues[correspondingvalues.high]: + result = arr[correspondingvalues.high] + break + largenumrindex = largenumrindex + 1 + smallernumindex = smallernumindex + 1 + +proc sample*(q: var MersenneTwister, arr: seq[string]): string = + ## take random sample of an seq[string]. + var correspondingvalues: seq[uint32] + var maxVal: uint32 = uint32(4294967295) + let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + for i in arr: + correspondingvalues.add(maxVal) + maxVal = maxVal - maxValdivlenarr + let num = uint32(getNum(q)) + var largenumrindex: uint32 = 0 + var smallernumindex: uint32 = 1 + while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): + if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + result = arr[largenumrindex] + break + elif num < correspondingvalues[correspondingvalues.high]: + result = arr[correspondingvalues.high] + break + largenumrindex = largenumrindex + 1 + smallernumindex = smallernumindex + 1 + + + + +proc sample*(q: var MersenneTwister, arr: seq[float]): float = + ## take random sample of an seq[float]. + + var correspondingvalues: seq[uint32] + var maxVal: uint32 = uint32(4294967295) + let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + for i in arr: + correspondingvalues.add(maxVal) + maxVal = maxVal - maxValdivlenarr + let num = uint32(getNum(q)) + var largenumrindex: uint32 = 0 + var smallernumindex: uint32 = 1 + while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): + if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + result = arr[largenumrindex] + break + elif num < correspondingvalues[correspondingvalues.high]: + result = arr[correspondingvalues.high] + break + largenumrindex = largenumrindex + 1 + smallernumindex = smallernumindex + 1 diff --git a/tests/stdlib/tmersenne.nim b/tests/stdlib/tmersenne.nim index 2707aa2f2adbd..475650540c328 100644 --- a/tests/stdlib/tmersenne.nim +++ b/tests/stdlib/tmersenne.nim @@ -6,6 +6,13 @@ template main() = doAssert mt.getNum == 407788156'u32 doAssert mt.getNum == 1071751096'u32 doAssert mt.getNum == 3805347140'u32 + doAssert sample(mt, @[30, 20, 10]) == 20 + doAssert sample(mt, @[30.4, 20.54, 10.5]) == 10.5 + doAssert sample(mt, @['a', 'b', 'c']) == 'b' + doAssert sample(mt, @["abc", "def", "ghi"]) == "def" + + + static: main() main() From 0779583860670ce14735316253e3cbbd4989f0fd Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 17:57:46 -0700 Subject: [PATCH 02/18] Fixed comments to comply with https://nim-lang.github.io/Nim/contributing.html#documentation-style-procs-templates-macros-converters-and-iterators --- lib/pure/mersenne.nim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 1a82b690999e1..2eb782127b8c0 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -54,14 +54,14 @@ proc getNum*(m: var MersenneTwister): uint32 = result = result xor (result shr 18'u32) proc getSeq*(m: var MersenneTwister, len: int): seq[int] = - ## returns seq of pseudorandom ints len long. + ## Returns seq of pseudorandom ints len long. for i in 1..len: result.add(int(getNum(m))) ## Might be useful at some point to someone. proc sample*(q: var MersenneTwister, arr: seq[int]): int = - ## take random sample of an seq[int]. + ## Takes random sample of an seq[int]. var correspondingvalues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) @@ -83,7 +83,7 @@ proc sample*(q: var MersenneTwister, arr: seq[int]): int = proc sample*(q: var MersenneTwister, arr: seq[char]): char = - ## take random sample of an seq[char]. + ## Takes random sample of an seq[char]. var correspondingvalues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) @@ -104,7 +104,7 @@ proc sample*(q: var MersenneTwister, arr: seq[char]): char = smallernumindex = smallernumindex + 1 proc sample*(q: var MersenneTwister, arr: seq[string]): string = - ## take random sample of an seq[string]. + ## Takes random sample of an seq[string]. var correspondingvalues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) @@ -128,7 +128,7 @@ proc sample*(q: var MersenneTwister, arr: seq[string]): string = proc sample*(q: var MersenneTwister, arr: seq[float]): float = - ## take random sample of an seq[float]. + ## Takes random sample of an seq[float]. var correspondingvalues: seq[uint32] var maxVal: uint32 = uint32(4294967295) From 21fb88240f8a0f2c3bcaa1afea44cd54937b54e5 Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 17:58:21 -0700 Subject: [PATCH 03/18] Accidental whitespace. Sorry. --- lib/pure/mersenne.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 2eb782127b8c0..5c05adc75a999 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -128,7 +128,7 @@ proc sample*(q: var MersenneTwister, arr: seq[string]): string = proc sample*(q: var MersenneTwister, arr: seq[float]): float = - ## Takes random sample of an seq[float]. + ## Takes random sample of an seq[float]. var correspondingvalues: seq[uint32] var maxVal: uint32 = uint32(4294967295) From 5b7ef5385650067fa71c5abccc72fa4a783011cf Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 18:23:29 -0700 Subject: [PATCH 04/18] Fix variable naming, at least mostly. --- lib/pure/mersenne.nim | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 5c05adc75a999..64944d60ccdf8 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -62,21 +62,21 @@ proc getSeq*(m: var MersenneTwister, len: int): seq[int] = proc sample*(q: var MersenneTwister, arr: seq[int]): int = ## Takes random sample of an seq[int]. - var correspondingvalues: seq[uint32] + var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) - let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: - correspondingvalues.add(maxVal) - maxVal = maxVal - maxValdivlenarr - let num = uint32(getNum(q)) + correspondingValues.add(maxVal) + maxVal = maxVal - maxValDivLenArr + let randNum =uint32(getNum(q)) var largenumrindex: uint32 = 0 var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): - if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): + if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: result = arr[largenumrindex] break - elif num < correspondingvalues[correspondingvalues.high]: - result = arr[correspondingvalues.high] + elif randNum < correspondingValues[correspondingValues.high]: + result = arr[correspondingValues.high] break largenumrindex = largenumrindex + 1 smallernumindex = smallernumindex + 1 @@ -84,42 +84,42 @@ proc sample*(q: var MersenneTwister, arr: seq[int]): int = proc sample*(q: var MersenneTwister, arr: seq[char]): char = ## Takes random sample of an seq[char]. - var correspondingvalues: seq[uint32] + var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) - let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: - correspondingvalues.add(maxVal) - maxVal = maxVal - maxValdivlenarr - let num = uint32(getNum(q)) + correspondingValues.add(maxVal) + maxVal = maxVal - maxValDivLenArr + let randNum =uint32(getNum(q)) var largenumrindex: uint32 = 0 var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): - if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): + if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: result = arr[largenumrindex] break - elif num < correspondingvalues[correspondingvalues.high]: - result = arr[correspondingvalues.high] + elif randNum < correspondingValues[correspondingValues.high]: + result = arr[correspondingValues.high] break largenumrindex = largenumrindex + 1 smallernumindex = smallernumindex + 1 proc sample*(q: var MersenneTwister, arr: seq[string]): string = ## Takes random sample of an seq[string]. - var correspondingvalues: seq[uint32] + var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) - let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: - correspondingvalues.add(maxVal) - maxVal = maxVal - maxValdivlenarr - let num = uint32(getNum(q)) + correspondingValues.add(maxVal) + maxVal = maxVal - maxValDivLenArr + let randNum =uint32(getNum(q)) var largenumrindex: uint32 = 0 var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): - if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): + if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: result = arr[largenumrindex] break - elif num < correspondingvalues[correspondingvalues.high]: - result = arr[correspondingvalues.high] + elif randNum < correspondingValues[correspondingValues.high]: + result = arr[correspondingValues.high] break largenumrindex = largenumrindex + 1 smallernumindex = smallernumindex + 1 @@ -130,21 +130,21 @@ proc sample*(q: var MersenneTwister, arr: seq[string]): string = proc sample*(q: var MersenneTwister, arr: seq[float]): float = ## Takes random sample of an seq[float]. - var correspondingvalues: seq[uint32] + var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) - let maxValdivlenarr: uint32 = uint32(float32(maxVal) / float32(len(arr))) + let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: - correspondingvalues.add(maxVal) - maxVal = maxVal - maxValdivlenarr - let num = uint32(getNum(q)) + correspondingValues.add(maxVal) + maxVal = maxVal - maxValDivLenArr + let randNum =uint32(getNum(q)) var largenumrindex: uint32 = 0 var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingvalues)) and smallernumindex < uint32(len(correspondingvalues)): - if num < correspondingvalues[largenumrindex] and num > correspondingvalues[smallernumindex]: + while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): + if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: result = arr[largenumrindex] break - elif num < correspondingvalues[correspondingvalues.high]: - result = arr[correspondingvalues.high] + elif randNum < correspondingValues[correspondingValues.high]: + result = arr[correspondingValues.high] break largenumrindex = largenumrindex + 1 smallernumindex = smallernumindex + 1 From ce248ae9faf35e19b449cdd971e10efbcf4992ac Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 21:54:13 -0700 Subject: [PATCH 05/18] Replace lots of useful code with generic proc. --- lib/pure/mersenne.nim | 82 +++---------------------------------------- 1 file changed, 5 insertions(+), 77 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 64944d60ccdf8..7d60d36294fce 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -57,94 +57,22 @@ proc getSeq*(m: var MersenneTwister, len: int): seq[int] = ## Returns seq of pseudorandom ints len long. for i in 1..len: result.add(int(getNum(m))) - ## Might be useful at some point to someone. - - -proc sample*(q: var MersenneTwister, arr: seq[int]): int = - ## Takes random sample of an seq[int]. - var correspondingValues: seq[uint32] - var maxVal: uint32 = uint32(4294967295) - let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) - for i in arr: - correspondingValues.add(maxVal) - maxVal = maxVal - maxValDivLenArr - let randNum =uint32(getNum(q)) - var largenumrindex: uint32 = 0 - var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): - if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: - result = arr[largenumrindex] - break - elif randNum < correspondingValues[correspondingValues.high]: - result = arr[correspondingValues.high] - break - largenumrindex = largenumrindex + 1 - smallernumindex = smallernumindex + 1 - - -proc sample*(q: var MersenneTwister, arr: seq[char]): char = - ## Takes random sample of an seq[char]. - var correspondingValues: seq[uint32] - var maxVal: uint32 = uint32(4294967295) - let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) - for i in arr: - correspondingValues.add(maxVal) - maxVal = maxVal - maxValDivLenArr - let randNum =uint32(getNum(q)) - var largenumrindex: uint32 = 0 - var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): - if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: - result = arr[largenumrindex] - break - elif randNum < correspondingValues[correspondingValues.high]: - result = arr[correspondingValues.high] - break - largenumrindex = largenumrindex + 1 - smallernumindex = smallernumindex + 1 - -proc sample*(q: var MersenneTwister, arr: seq[string]): string = - ## Takes random sample of an seq[string]. - var correspondingValues: seq[uint32] - var maxVal: uint32 = uint32(4294967295) - let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) - for i in arr: - correspondingValues.add(maxVal) - maxVal = maxVal - maxValDivLenArr - let randNum =uint32(getNum(q)) - var largenumrindex: uint32 = 0 - var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): - if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: - result = arr[largenumrindex] - break - elif randNum < correspondingValues[correspondingValues.high]: - result = arr[correspondingValues.high] - break - largenumrindex = largenumrindex + 1 - smallernumindex = smallernumindex + 1 - - - - -proc sample*(q: var MersenneTwister, arr: seq[float]): float = - ## Takes random sample of an seq[float]. +proc sample*[T](q: var MersenneTwister, arr: seq[T]): T = + ## Takes random sample of an seq[T]. var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: correspondingValues.add(maxVal) maxVal = maxVal - maxValDivLenArr - let randNum =uint32(getNum(q)) + let randNum = uint32(getNum(q)) var largenumrindex: uint32 = 0 var smallernumindex: uint32 = 1 while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: - result = arr[largenumrindex] - break + return arr[largenumrindex] elif randNum < correspondingValues[correspondingValues.high]: - result = arr[correspondingValues.high] - break + return arr[correspondingValues.high] largenumrindex = largenumrindex + 1 smallernumindex = smallernumindex + 1 From 5cf29f7c34bbdc7dbc4fc5b23d07ae2f4f74965c Mon Sep 17 00:00:00 2001 From: pyautogui Date: Tue, 29 Jun 2021 22:14:42 -0700 Subject: [PATCH 06/18] Consistent camelCase. --- lib/pure/mersenne.nim | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 7d60d36294fce..ef2dceca67f2f 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -53,26 +53,26 @@ proc getNum*(m: var MersenneTwister): uint32 = result = result xor ((result shl 15'u32) and 0xefc60000'u32) result = result xor (result shr 18'u32) -proc getSeq*(m: var MersenneTwister, len: int): seq[int] = +proc getSeq*(mt: var MersenneTwister, len: int): seq[int] = ## Returns seq of pseudorandom ints len long. for i in 1..len: - result.add(int(getNum(m))) + result.add(int(getNum(mt))) -proc sample*[T](q: var MersenneTwister, arr: seq[T]): T = - ## Takes random sample of an seq[T]. +proc sample*[T](mt: var MersenneTwister, arr: seq[T]): T = + ## Takes random sample of an seq[int]. var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) for i in arr: correspondingValues.add(maxVal) maxVal = maxVal - maxValDivLenArr - let randNum = uint32(getNum(q)) - var largenumrindex: uint32 = 0 - var smallernumindex: uint32 = 1 - while largenumrindex < uint32(len(correspondingValues)) and smallernumindex < uint32(len(correspondingValues)): - if randNum < correspondingValues[largenumrindex] and randNum > correspondingValues[smallernumindex]: - return arr[largenumrindex] + let randNum = uint32(getNum(mt)) + var largerNumIndex: uint32 = 0 + var smallerNumIndex: uint32 = 1 + while largerNumIndex < uint32(len(correspondingValues)) and smallerNumIndex < uint32(len(correspondingValues)): + if randNum < correspondingValues[largerNumIndex] and randNum > correspondingValues[smallerNumIndex]: + return arr[largerNumIndex] elif randNum < correspondingValues[correspondingValues.high]: return arr[correspondingValues.high] - largenumrindex = largenumrindex + 1 - smallernumindex = smallernumindex + 1 + largerNumIndex = largerNumIndex + 1 + smallerNumIndex = smallerNumIndex + 1 From 7339b5bcfaf6f555d433b8090ab8af9aaad72477 Mon Sep 17 00:00:00 2001 From: pyautogui Date: Wed, 30 Jun 2021 07:27:30 -0700 Subject: [PATCH 07/18] Fix misleading comment --- lib/pure/mersenne.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index ef2dceca67f2f..5ec5216b6a8bc 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -59,7 +59,7 @@ proc getSeq*(mt: var MersenneTwister, len: int): seq[int] = result.add(int(getNum(mt))) proc sample*[T](mt: var MersenneTwister, arr: seq[T]): T = - ## Takes random sample of an seq[int]. + ## Takes random sample of an seq[T]. var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) From 79d69833874410dde4638a8aa2fb6e418bd7e51a Mon Sep 17 00:00:00 2001 From: pyautogui Date: Fri, 2 Jul 2021 14:37:50 -0700 Subject: [PATCH 08/18] Add deprecation pragmas as suggested by @c-blake. --- lib/pure/mersenne.nim | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 5ec5216b6a8bc..04d151241c532 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -19,13 +19,15 @@ runnableExamples: ## See also ## ======== ## * `random module`_ for Nim's standard random number generator + type MersenneTwister* = object ## The Mersenne Twister. mt: array[0..623, uint32] index: int -proc newMersenneTwister*(seed: uint32): MersenneTwister = +proc newMersenneTwister*(seed: uint32): MersenneTwister {.deprecated: +"deprecated, use random.randomize() instead"} = ## Creates a new `MersenneTwister` with seed `seed`. result.index = 0 result.mt[0] = seed @@ -34,6 +36,7 @@ proc newMersenneTwister*(seed: uint32): MersenneTwister = (result.mt[i-1] shr 30'u32)) + i) proc generateNumbers(m: var MersenneTwister) = + for i in 0..623: var y = (m.mt[i] and 0x80000000'u32) + (m.mt[(i+1) mod 624] and 0x7fffffff'u32) @@ -41,7 +44,8 @@ proc generateNumbers(m: var MersenneTwister) = if (y mod 2'u32) != 0: m.mt[i] = m.mt[i] xor 0x9908b0df'u32 -proc getNum*(m: var MersenneTwister): uint32 = +proc getNum*(m: var MersenneTwister): uint32 {.deprecated: +"deprecated, use random.rand() instead"} = ## Returns the next pseudorandom `uint32`. if m.index == 0: generateNumbers(m) @@ -53,12 +57,14 @@ proc getNum*(m: var MersenneTwister): uint32 = result = result xor ((result shl 15'u32) and 0xefc60000'u32) result = result xor (result shr 18'u32) -proc getSeq*(mt: var MersenneTwister, len: int): seq[int] = +proc getSeq*(mt: var MersenneTwister, len: int): seq[int] {.deprecated: +"deprecated, use random.rand() instead"} = ## Returns seq of pseudorandom ints len long. for i in 1..len: result.add(int(getNum(mt))) -proc sample*[T](mt: var MersenneTwister, arr: seq[T]): T = +proc sample*[T](mt: var MersenneTwister, arr: seq[T]): T {.deprecated: +"deprecated, use random.sample() instead"} = ## Takes random sample of an seq[T]. var correspondingValues: seq[uint32] var maxVal: uint32 = uint32(4294967295) From 1aaa28176818696135b292c3f990f075ebf1346c Mon Sep 17 00:00:00 2001 From: pyautogui Date: Fri, 2 Jul 2021 15:49:41 -0700 Subject: [PATCH 09/18] Remove useless procs, deprecate whole module. --- lib/pure/mersenne.nim | 38 ++++++-------------------------------- 1 file changed, 6 insertions(+), 32 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 04d151241c532..24b6a6c236156 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -1,3 +1,4 @@ + # # # Nim's Runtime Library @@ -10,7 +11,8 @@ ## The [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) ## random number generator. ## -## **Note:** The procs in this module work at compile-time. +## **Note:** The procs in this module work at compile-time +{.deprecated:"import std/random instead.".} runnableExamples: var rand = newMersenneTwister(uint32.high) ## must be "var" @@ -26,8 +28,7 @@ type mt: array[0..623, uint32] index: int -proc newMersenneTwister*(seed: uint32): MersenneTwister {.deprecated: -"deprecated, use random.randomize() instead"} = +proc newMersenneTwister*(seed: uint32): MersenneTwister = ## Creates a new `MersenneTwister` with seed `seed`. result.index = 0 result.mt[0] = seed @@ -44,8 +45,7 @@ proc generateNumbers(m: var MersenneTwister) = if (y mod 2'u32) != 0: m.mt[i] = m.mt[i] xor 0x9908b0df'u32 -proc getNum*(m: var MersenneTwister): uint32 {.deprecated: -"deprecated, use random.rand() instead"} = +proc getNum*(m: var MersenneTwister): uint32 = ## Returns the next pseudorandom `uint32`. if m.index == 0: generateNumbers(m) @@ -55,30 +55,4 @@ proc getNum*(m: var MersenneTwister): uint32 {.deprecated: result = result xor (result shr 11'u32) result = result xor ((result shl 7'u32) and 0x9d2c5680'u32) result = result xor ((result shl 15'u32) and 0xefc60000'u32) - result = result xor (result shr 18'u32) - -proc getSeq*(mt: var MersenneTwister, len: int): seq[int] {.deprecated: -"deprecated, use random.rand() instead"} = - ## Returns seq of pseudorandom ints len long. - for i in 1..len: - result.add(int(getNum(mt))) - -proc sample*[T](mt: var MersenneTwister, arr: seq[T]): T {.deprecated: -"deprecated, use random.sample() instead"} = - ## Takes random sample of an seq[T]. - var correspondingValues: seq[uint32] - var maxVal: uint32 = uint32(4294967295) - let maxValDivLenArr: uint32 = uint32(float32(maxVal) / float32(len(arr))) - for i in arr: - correspondingValues.add(maxVal) - maxVal = maxVal - maxValDivLenArr - let randNum = uint32(getNum(mt)) - var largerNumIndex: uint32 = 0 - var smallerNumIndex: uint32 = 1 - while largerNumIndex < uint32(len(correspondingValues)) and smallerNumIndex < uint32(len(correspondingValues)): - if randNum < correspondingValues[largerNumIndex] and randNum > correspondingValues[smallerNumIndex]: - return arr[largerNumIndex] - elif randNum < correspondingValues[correspondingValues.high]: - return arr[correspondingValues.high] - largerNumIndex = largerNumIndex + 1 - smallerNumIndex = smallerNumIndex + 1 + result = result xor (result shr 18'u32) \ No newline at end of file From 1ca1688b91a05ca8e05e4959064f110f35c2cbbc Mon Sep 17 00:00:00 2001 From: pyautogui Date: Fri, 2 Jul 2021 22:53:51 -0700 Subject: [PATCH 10/18] Remove useless procs, deprecate whole module. --- tests/stdlib/tmersenne.nim | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/stdlib/tmersenne.nim b/tests/stdlib/tmersenne.nim index 475650540c328..54eb7b216b2c7 100644 --- a/tests/stdlib/tmersenne.nim +++ b/tests/stdlib/tmersenne.nim @@ -6,12 +6,6 @@ template main() = doAssert mt.getNum == 407788156'u32 doAssert mt.getNum == 1071751096'u32 doAssert mt.getNum == 3805347140'u32 - doAssert sample(mt, @[30, 20, 10]) == 20 - doAssert sample(mt, @[30.4, 20.54, 10.5]) == 10.5 - doAssert sample(mt, @['a', 'b', 'c']) == 'b' - doAssert sample(mt, @["abc", "def", "ghi"]) == "def" - - static: main() From b22d66b27130f82f235484eeb9320d088f1db7b2 Mon Sep 17 00:00:00 2001 From: pyautogui Date: Fri, 2 Jul 2021 22:57:53 -0700 Subject: [PATCH 11/18] Remove useless whitespace. --- lib/pure/mersenne.nim | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 24b6a6c236156..995c817623aa4 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -3,25 +3,19 @@ # # Nim's Runtime Library # (c) Copyright 2015 Nim Contributors -# # See the file "copying.txt", included in this # distribution, for details about the copyright. -# - ## The [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) ## random number generator. -## ## **Note:** The procs in this module work at compile-time {.deprecated:"import std/random instead.".} runnableExamples: var rand = newMersenneTwister(uint32.high) ## must be "var" doAssert rand.getNum() != rand.getNum() ## pseudorandom number - ## See also ## ======== ## * `random module`_ for Nim's standard random number generator - type MersenneTwister* = object ## The Mersenne Twister. @@ -51,7 +45,6 @@ proc getNum*(m: var MersenneTwister): uint32 = generateNumbers(m) result = m.mt[m.index] m.index = (m.index + 1) mod m.mt.len - result = result xor (result shr 11'u32) result = result xor ((result shl 7'u32) and 0x9d2c5680'u32) result = result xor ((result shl 15'u32) and 0xefc60000'u32) From e2e47d69dcd566d1e6f221162e3e3e992c000b0b Mon Sep 17 00:00:00 2001 From: pyautogui <79544976+pyautogui@users.noreply.github.com> Date: Fri, 2 Jul 2021 23:00:26 -0700 Subject: [PATCH 12/18] Update lib/pure/mersenne.nim Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> --- lib/pure/mersenne.nim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 995c817623aa4..524054527bfde 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -1,4 +1,3 @@ - # # # Nim's Runtime Library @@ -48,4 +47,4 @@ proc getNum*(m: var MersenneTwister): uint32 = result = result xor (result shr 11'u32) result = result xor ((result shl 7'u32) and 0x9d2c5680'u32) result = result xor ((result shl 15'u32) and 0xefc60000'u32) - result = result xor (result shr 18'u32) \ No newline at end of file + result = result xor (result shr 18'u32) From ee197e41e31e00167aa7c66f4c176636f1b754ec Mon Sep 17 00:00:00 2001 From: pyautogui <79544976+pyautogui@users.noreply.github.com> Date: Fri, 2 Jul 2021 23:01:24 -0700 Subject: [PATCH 13/18] Update lib/pure/mersenne.nim Doc generation changes, I guess? Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> --- lib/pure/mersenne.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 524054527bfde..02b50abdd00d5 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -6,7 +6,7 @@ # distribution, for details about the copyright. ## The [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) ## random number generator. -## **Note:** The procs in this module work at compile-time +## .. note:: The procs in this module work at compile-time. {.deprecated:"import std/random instead.".} runnableExamples: From bc0c6c2ed9e6acfc87534c3961a0c889a44c9766 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Sat, 3 Jul 2021 21:02:39 +0200 Subject: [PATCH 14/18] Update lib/pure/mersenne.nim Co-authored-by: Timothee Cour --- lib/pure/mersenne.nim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pure/mersenne.nim b/lib/pure/mersenne.nim index 02b50abdd00d5..6ec0d66b40c57 100644 --- a/lib/pure/mersenne.nim +++ b/lib/pure/mersenne.nim @@ -7,7 +7,8 @@ ## The [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) ## random number generator. ## .. note:: The procs in this module work at compile-time. -{.deprecated:"import std/random instead.".} + +{.deprecated: "use `std/random` instead.".} runnableExamples: var rand = newMersenneTwister(uint32.high) ## must be "var" From 37235cc289b653094cc57ee5c039529606673b10 Mon Sep 17 00:00:00 2001 From: pyautogui Date: Sat, 3 Jul 2021 14:09:20 -0700 Subject: [PATCH 15/18] Add "Deprecate std/mersenne" to changelog. --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 6672f7538ab1e..64794d2fac345 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,7 @@ ## Changes affecting backward compatibility - +- Deprecate std/mersenne - `cuchar` now aliases `uint8` instead of `char` - `repr` now doesn't insert trailing newline; previous behavior was very inconsistent, From ea1961e5dfd94ec7f488f453b1a7de94a63499ee Mon Sep 17 00:00:00 2001 From: pyautogui Date: Sat, 3 Jul 2021 14:18:17 -0700 Subject: [PATCH 16/18] Fix positioning in changelog of "Deprecated std/mersenne" --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 64794d2fac345..929a452e13899 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,6 @@ ## Changes affecting backward compatibility -- Deprecate std/mersenne - `cuchar` now aliases `uint8` instead of `char` - `repr` now doesn't insert trailing newline; previous behavior was very inconsistent, @@ -95,6 +94,7 @@ ## Standard library additions and changes +- Deprecated std/mersenne - `strformat`: added support for parenthesized expressions. From 96ecbeddc4567767d69546675058bc2b52dd757e Mon Sep 17 00:00:00 2001 From: pyautogui Date: Sun, 4 Jul 2021 13:24:34 -0700 Subject: [PATCH 17/18] Revert "Fix positioning in changelog of "Deprecated std/mersenne"" This reverts commit ea1961e5dfd94ec7f488f453b1a7de94a63499ee. --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 929a452e13899..64794d2fac345 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ ## Changes affecting backward compatibility +- Deprecate std/mersenne - `cuchar` now aliases `uint8` instead of `char` - `repr` now doesn't insert trailing newline; previous behavior was very inconsistent, @@ -94,7 +95,6 @@ ## Standard library additions and changes -- Deprecated std/mersenne - `strformat`: added support for parenthesized expressions. From faf7abaf5b1748c11fe12a5ee1dc94f15e338b0f Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 5 Jul 2021 10:11:45 -0700 Subject: [PATCH 18/18] Update changelog.md --- changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 64794d2fac345..a4c5b4e627320 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,9 @@ ## Changes affecting backward compatibility -- Deprecate std/mersenne + +- Deprecated `std/mersenne` + - `cuchar` now aliases `uint8` instead of `char` - `repr` now doesn't insert trailing newline; previous behavior was very inconsistent,