高精度で一連の二重乱数を生成しようとしています。たとえば、0.856365621 (小数点以下 9 桁) です。
インターネットからいくつかの方法を見つけましたが、それらは二重の乱数を生成しますが、精度は要求したほど良くありません (小数点以下 6 桁のみ)。
では、自分の目標を達成する方法を知ることができますか?
C++11 では、<random>
ヘッダーを使用できます。この特定の例では、I am を使用して、桁std::uniform_real_distribution
数を超える乱数を生成できます。6
印刷される桁数の設定を確認するには、次std::cout
を使用する必要がありますstd::setprecision
。
#include <iostream>
#include <random>
#include <iomanip>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_real_distribution<> dist(1, 10);
for( int i = 0 ; i < 10; ++i )
{
std::cout << std::fixed << std::setprecision(10) << dist(e2) << std::endl ;
}
return 0 ;
}
std::numeric_limits::digits10
使用可能な精度を決定するために使用できます。
std::cout << std::numeric_limits<double>::digits10 << std::endl;
典型的なシステムでは、RAND_MAX は 2 31 -1 またはそれに類似した値です。したがって、次のような方法を使用することによる「精度」:L
double r = rand()/RAND_MAX;
1/(2<sup>31</sup)-1
これにより、乱数で8〜9桁の「精度」が得られるはずです。十分に高い精度で印刷してください。
cout << r << endl;
しません。これはうまくいきます:
cout << fixed << sprecision(15) << r << endl;
もちろん、RAND_MAX がはるかに小さいシステムもいくつかあります。その場合、結果は「正確」ではない可能性があります。サミー」。
代わりに、ランダム関数の複数回の呼び出しから値を作成してみませんか?
例えば:
const int numDecimals = 9;
double result = 0.0;
double div = 1.0;
double mul = 1.0;
for (int n = 0; n < numDecimals; ++n)
{
int t = rand() % 10;
result += t * mul;
mul *= 10.0;
div /= 10.0;
}
result = result * div;
私は個人的に rand 関数の新しい実装を試すか、少なくとも現在の時間か何かで乗算します..