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

本WebサイトはcookieをPHPのセッション識別および左欄目次の開閉状況記憶のために使用しています。同意できる方のみご覧ください。More information about cookies
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