C++のrand()関数でRAND_MAX以上の乱数を作る方法
1月 13th, 2009 Posted in C++C++で乱数を発生させるときに使うrand関数ですが、これは乱数の最大値がRAND_MAXまでなんですよね。で、今までは乱数と行っても0から1までとか、0から256までとかの範囲で求めることしかなかったので、あんまり気にしていなかったんですが、このRAND_MAXって0x7FFFって定義されているんです。
このあたりのことで以下のブログが実験してます。この人もrand()の最大値を意識していなかったってことですかね。
rand() の最大値 RAND_MAX (株式会社ディア Dear inc.)
それで、今回0xFFFFまでの乱数を発生させる必要があったんですが、これをどうやればrand()で実現できるか。よくわかりませんでした・・・。
範囲指定の公式があるらしい
乱数によると、rand()関数を使ってある範囲の乱数を作るときの公式は、以下となります。
- 最小値 + (int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX) )
rand()を二乗することによって
- 0x7FFF × 0x7FFF = 0x3FFF0001
まで乱数を発生させることができます。これを上の式に当てはめると、
- 最小値 + (int)( rand() * rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX * RAND_MAX) )
となるのかな?ここで最小値は0を想定しているので、
- rand() * rand() * (最大値 + 1.0) / (1.0 + RAND_MAX * RAND_MAX)
となります。これって結局、
- (rand() * rand()) % (最大値 + 1.0)
と同じことですね。
ただrand()を使う方法だと偶数が出現する確率が大きくなるらしいので、精密な乱数が欲しい場合には乱数発生関数を自作するのがよさそうですね。
こちらもオススメ!