道民学生プログラマの憂鬱

やるきになったら書く

いろんなRand()

前書き

各言語や、コンパイラでRand関数の実装は異なります。
今回はいろんな実装を紹介していきます。

Visual C++

Visual C++ での実装は以下の通りです。

long visual_cppx = 1;
void srand(long a) { visual_cppx = a; }
int  rand(void) { visual_cppx = visual_cppx * 214013 + 2531011; return(int)(visual_cppx >> 16) & 32767; }

このような実装になっているらしいです。 (参考文献より。
C#は、公式にコードが公開されているのでそちらを見てくださいということで。

UNIX /usr/ucb/cc

にあるrand.

long usr_ucb_cc_rndx = 1;
void srand(long a) { usr_ucb_cc_rndx=a; }
long rand(void) {/* x = x * 1103515245 + 12345;*/ return (usr_ucb_cc_rndx * 1103515245 + 12345) & 2147483647; }

参考文献では、独自に調べているようですがどのように調べているんでしょうか。
独自に調べようにも、やり方がわからんのです。。。
いくつか乱数を生成して、そこから推測するのでしょうが....
やり方わかる人いたら教えてください。

逆アセンブル

したらいけるかもしれないけど...
Pythonとかスクリプト言語だと通用しないですよねぇ....
参考文献をまとめまとめたコードをGistに置いときます。
rands.h - Gist

参考文献

良い乱数・悪い乱数