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を与えてやる。

programming/nim/random.txt · 最終更新: 2018/11/11 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0