パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

プチコン3号講座 擬似乱数の生成

2015-07-26 | プチコン3、4、BIG
第7回 擬似乱数を生成してみます。

リプレイを作成する際、プレイヤーの操作を記録しておけばいいのですが
相手のAIに乱数などを使っている際にすべて記録が必要になります。

そこで、乱数を同じパターンで発生させたいと考えてみました。

擬似乱数という、言葉をみつけて、一番簡単そうなノイマンの平方採中法を参考に実装してみます。

擬似乱数の説明

説明には
「計算の結果、過去に現れた数と同じ数が現れればループとなり、
その長さを周期と言うが、線形合同法を使えば周期が最長のものが理論的に可能であるため、
現代において平方採中法が利用されることはまずない。
(wikipediaより)
とあったのですが

周期が100以上の長いものを予め探して、元となる4桁の数にしています。
あとノイマンのものだと中間4桁なのですが乱数を作成する際には3桁に変更しています。

使い方
(1)RSを関数呼び出し前に定義
(2)IRNDINIT(I)でベースとなる数をRSに設定 I は0から24
(3)IRND(100)だと0から99までの数を作成(循環が100回なので発生しない数もある)


実行してみるとパターンに入るものがあります。
画面右中央に同じ形でかたまる4つの物体が現れます。

右脳の優れた方ならパターンがいろいろみつけられそうです。



このあと、このロジックを自作の迷路に入れてみました。
結果大失敗!!

100個程度の周期の乱数では全然足りないようで迷路の作成終了まで行けませんでした。

100個までは循環しなかったのですが、その後の値を調べてみるといずれも小さな循環に入ります。
2100 4100 8100 6100 2100 .... .... ....

「現代において利用されることはまずない」と書かれている理由がわかりました。


同じ数が登場する周期も最大110まで行けません。


次回、5行のプログラムで解決します。
第8回 前回失敗した擬似乱数の作成と検証用プログラムの作成です。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。