exp777.hatenablog.com

頭の中はゲームでいっぱい

これでいいのか…?

冬休みが残り少ないので宿題のプログラミングにとりかかった。
C++でランダムな実数を作ることになったのだけど、

int randSign()
{
 return (rand() & 1) ? 1 : -1;
}

double randDouble()
{
 return randSign() * (double)(rand() * (RAND_MAX + 1) + rand()) / (double)(RAND_MAX + 1);
}

我ながらこれは適当すぎる…まずrand()を使ってる時点でやる気のなさがありありと…他の部分も完成して余裕があったらここは差し替えた方が良さそう。メルセンヌ・ツイスタでも実装する?
ポケモントレーナーの方々にわかりやすく書くと、rand()で使われているアルゴリズム(合同線形法)はいわゆる遭遇乱数のアルゴリズムと同じです。メルセンヌ・ツイスタはタマゴ乱数のアルゴリズムと同じものです。
乱数の仕組みに目を通したことがある人なら、遭遇乱数が単純な式で計算されていることをご存知かと思います。さらにCのrand()では周期が32768しかないのでいろいろとひどいのです。
いや32768は周期じゃなくて値の範囲だ。それでも周期は短い方らしいのですが。