2014-10-30

Cの乱数ルーチン

掲示板初心者rand()の使い方を質問してると、

rand() % N はいかん。下位ビットは偏りがでる」

かいまだにドヤ顔で教えてる人がいるね。

C FAQに書いてあるからだろうけど、あれ20年以上前文章で、いまどき下位ビットから極端に周期が短い処理系とかないと思うんだけどね。

初心者が使う用途ならたいがい rand() % N で十分なはず。

しろrand() % Nのかわりにって教えてるコード

「(int)((double)rand() / RAND_MAX * N)」 とか 「rand() >> 16」 とかバグってたりすることがあって、素直に rand() % N 使えよって感じになる。

むかしカルドセプトってゲーム乱数ルーチンバグって、偶数奇数が交互にでるって現象があってネット上でやっぱり「こう書け」みたいに乱数ルーチン書いてる人がいたけど、そういう人たちもバグってるの多かったね。

変に工夫するからバグるんだわ。

ゲーム程度なら素直に rand() % N 使っとけよって感じ。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん