Nimで乱数生成は、mersenneまたはrandomモジュールを使う。
シンプルなメルセンヌツイスタ発生器。uint32型のみ。
import mersenne
let mt = newMersenneTwister(1234) # 最初にシードを与えて初期化
for i in 1..5:
echo mt.getNum
# =>
# 407788156
# 1071751096
# 3805347140
# 2262621205
# 828021025
intやfloatなど汎用的に乱数を生成させる。ただ暗号強度としては弱いっぽい。
AtCoderのver.0.13ではまだ使えない。
注意点として、シードを与えずとも使えるのだが、その場合は実行毎に同じ乱数列が生成される。
import random
for i in 1..5:
echo rand(int.high)
# => (何回実行しても)
# 551579599
# 336666328
# 2000148485
# 1113308261
# 2026589088
randomize というシードを与える関数があるので、それを用いる。無引数でも何か適当にtickcountとか使って初期化してくれる。
import random
randomize()
for i in 1..5:
echo rand(int.high)
# => (実行ごとに変化)
# 1768567759
# 647888607
# 504179337
# 69130349
# 1606970134
# (引数の型 => 返値の型) # (int => int): 0..maxのintを生成 rand(10) # (float => float): 0.0..maxのfloatを生成 rand(10.0) # (range[int] => int): range内のint型を生成 rand(10..20) # (range[float] => float): range内のfloat型を生成 rand(10.0..20.0) # (openArray[T] => T): openArray内の要素を1つ抽出 rand(@[1, 2, 3, 5, 8])
rand()関数をC言語から持ってくることもできる。
import times
proc rand(): int {.header: "stdlib.h", importc: "rand".}
proc srand(seed: int) {.header: "stdlib.h", importc: "srand".}
srand(int(epochTime()))
Nimのrandomと同様、そのままでは実行毎に同じ乱数列が生成される。 実行時間などでseedを与えてやる。