(0,1) のような開区間で一様分布から乱数を生成する方法が見つかりません。
(double)rand()/RAND_MAX;
これには 0 と 1 が含まれますか? はいの場合、開いた間隔で乱数を生成する正しい方法は何ですか?
std::uniform_real_distributionを見てください! <cstdlib>
std::rand()のビルトインよりも専門的な疑似乱数ジェネレーターを使用できます。[0,1) の範囲で 10 個の乱数を出力するコード例を次に示します。
#include <iostream>
#include <random>
int main()
{
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);
for (int i=0; i<10; ++i)
std::cout << distribution(generator) << endl;
return 0;
}
正確にゼロになることはほとんどありません。0 を取得しないことが非常に重要な場合は、それを確認して別の数値を生成できます。
そしてもちろん、指定された乱数エンジンstd::mt19937
(つまり「非常に」ランダム) または最速のstd::knuth_b
.
私は何年も C++ を書いていませんが、次のコードを試してください。
double M = 0.00001, N = 0.99999;
double rNumber = M + rand() / (RAND_MAX / (N - M + 1) + 1);
私はもう何年も C++ でプログラミングしていませんが、私が行ったとき、rand の実装はコンパイラ固有でした。[0,RAND_MAX]、[0,RAND_MAX)、(0,RAND_MAX]、または (0,RAND_MAX) をカバーするかどうかに関して、実装はさまざまでした。
実装が閉じた区間 [0,RAND_MAX] を超えていると仮定すると、ワード サイズに(double)(rand()+1)/(RAND_MAX+2);
逆らわない限り、開いた区間 U(0,1) を生成する必要があります。この場合、long にキャストされます。RAND_MAX
ジェネレーターが異なる範囲をカバーする場合は、加法定数を調整します。
さらに良い解決策はrand
、Boost ライブラリの Mersenne Twister のようなものを捨てて使用することです。MT には、結果のオープン/クローズ範囲を明示的に制御できるさまざまな呼び出しがあります。