4

高精度で一連の二重乱数を生成しようとしています。たとえば、0.856365621 (小数点以下 9 桁) です。

インターネットからいくつかの方法を見つけましたが、それらは二重の乱数を生成しますが、精度は要求したほど良くありません (小数点以下 6 桁のみ)。

では、自分の目標を達成する方法を知ることができますか?

4

3 に答える 3

5

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;
于 2013-08-08T17:03:17.663 に答える
1

典型的なシステムでは、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 がはるかに小さいシステムもいくつかあります。その場合、結果は「正確」ではない可能性があります。サミー」。

于 2013-08-08T16:55:41.457 に答える
-1

代わりに、ランダム関数の複数回の呼び出しから値を作成してみませんか?

例えば:

   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 関数の新しい実装を試すか、少なくとも現在の時間か何かで乗算します..

于 2013-08-08T17:42:05.450 に答える