1 はじめに
C 言語の、0 から RAMD_MAX1 までの
整数の乱数を返す rand() という関数を使って、
例えばサイコロなどのように 1 から
まで (
)
の整数をランダムに作り出したい場合、
 |
(1) |
とするのが手っ取り早そうであるが、実はこれには問題がある。
以前 (少なくとも一部の rand() の実装では)、
偶数と奇数が交互に生成される仕様になっていて、
例えばサイコロの
の場合でも、
1,3,5 のいずれかと 2,4,6 のいずれかが交互に現われてしまうことになる。
これではランダムとは言えないだろう。
これはもちろん rand() の実装自体に問題があるのであるが、
この場合 (1) の代わりに、
 |
(2) |
のような方法がよく用いられる。これは、
rand() に対し、
 |
(3) |
によって
の範囲の実数の乱数
を生成し、
 |
(4) |
によって 1 から
までの乱数を得る方法である。
今回は、この方法の妥当性について検討してみることにする。
竹野茂治@新潟工科大学
2007年6月22日