2009年2月7日土曜日

random

良い乱数・悪い乱数
http://www001.upp.so-net.ne.jp/isaku/rand.html


static long x=1;
void srand(long s) { x=s; }
long rand() { x=x*1103515245+12345; return x&2147483647; }

 シンプルすぎて惚れる。

 まあそれはともかく
どうもマップ生成に再現性がなくて困っている。これではリプレイが実装できない。
 いままでMersenne Twister を使ってたんだけど、
コピペで使ってはいるが、実は使い方を間違ってるんじゃ? と思って検索をかけた。
 SFMT ってMTの弟が出来てた事が分かったが、
盛大にスルーして最初に書いたサイトさんにあったXorShift を試してみることにした。



unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; w="(w^(w">>19))^(t^(t>>8)) );
}

 それなりに高速でそれなりに実用的とのこと。

 ランダム生成部分を書き換えて実行してみたところ、
やはりマップ生成に再現性はなかった。
 分かったことはランダムの使い方は間違ってなかった。
自分のプログラムが糞だった、という当然の結論だった。

 必要最小限のプログラムをためしてみると問題なく同じマップが生成されるので、
どこかで何かがrand()を呼び出してるんだとは思うが、どこかわからん。

リプレイ? もう知らん。

 

0 件のコメント: