4

我正在尝试生成一系列高精度的双随机数。例如,0.856365621(小数点后有 9 位)。

我从互联网上找到了一些方法,但是,它们确实会生成双随机数,但精度不如我要求的好(小数点后只有 6 位)。

因此,我可以知道如何实现我的目标吗?

4

3 回答 3

5

在 C++11 中,您可以使用<random>标头,在这个特定示例中,使用std::uniform_real_distributionI 能够生成多于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 小得多,在这种情况下,结果可能不太“精确” - 但是,您仍然应该将数字降低到 9-12 范围内,只是它们更有可能是“相同”。

于 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 回答