random - Nimで乱数生成
Nimで乱数生成は、mersenne
またはrandom
モジュールを使う。
mersennneモジュール
シンプルなメルセンヌツイスタ発生器。uint32型のみ。
import mersenne let mt = newMersenneTwister(1234) # 最初にシードを与えて初期化 for i in 1..5: echo mt.getNum # => # 407788156 # 1071751096 # 3805347140 # 2262621205 # 828021025
randomモジュール
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])
C言語から
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を与えてやる。