SIMD-oriented Fast Mersenne Twister
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.htmlsoyoさんが紹介していたMT(Mersenne Twister)の改良版、
SIMD向きに最適化されており、MTは周期が2^19937-1だが、
これは2^607-1 〜 2^132049-1まで選択が可能、さらにおまけでdSFMT
なんていう浮動小数点数向けのものまであり、至れり尽くせりだ。
以前にはWellというものが発表され一時期騒がれた
http://www.iro.umontreal.ca/~panneton/WELLRNG.htmlもし、速ければいいやという方はxorshiftを使うとよい
http://www.jstatsoft.org/v08/i14/xorshift.pdfソースもここに書けるほどに短い
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; return( w=(w^(w>>19))^(t^(t>>8)) );
}
ただし見ての通り周期が2^128しかないので、
rand()じゃ不安だけどMTほどでもないというときに使うといいだろう。
ちなみにrand()はこんな感じで実装されている事が多い
int rand() { y=y*214013+2531011; return((y>>16)&32767); }