乱数のメモ

ある範囲の乱数を作成する場合、PHPならメルセンスツイスターというアルゴリズムを利用したmt_rand()を使えるので困らない。たぶん。

しかし、Cだと困る。例えば0~100の乱数を作りたい場合、


int num;
num = rand()%100;

ってやりたくなるが、これだと乱数とは思えない数字が生成される。
特に0~1としてみたら、そのひどさがわかる。


for (i = 0; i < 100; i++) {
    num = rand()%2;
    print("%d\\n", num);
}

たぶん、0と1が交互に出るんじゃないかと思う。
で、どうしたらいいかというと、もっとちゃんとした乱数発生アルゴリズム、つまりメルセンスツイスターを使えばいい。
ということになりますが、そこまでたいそうな話じゃない場合、簡単な変換式で対応できます。
このページ
がとっても参考になるんですが、いつもググって見つけてるのでメモしておいた次第です。
以下のような式です(こぴぺ)。


num = (int)((double)rand() / ((double)RAND_MAX + 1) * N);

あるいは


num = rand() / (RAND_MAX / N + 1);

Nは整数で、上記の例の10とか2。RAND_MAXは乱数の最大値。たぶん定義されてると思う。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C言語 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。