我试图生成一系列高精度的双随机数。例如,0.856365621(十进制后有9位数字)。
我已经从互联网上找到了一些方法,但是,它们会生成双重随机数,但精度不如我要求的那么好(小数点后只有6位数)。
因此,我可以知道如何实现我的目标吗?
答案 0 :(得分:4)
在C ++ 11中,您可以使用<random>
header,在此特定示例中使用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;
答案 1 :(得分:0)
在典型系统中,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范围内得到数字,只是它们更有可能要“相同”。
答案 2 :(得分:-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函数的新实现,或者至少与当前时间或其他东西相乘..