我想要生成一系列高精度的双精度随机数。例如,0.856365621(小数点后有9位数字)。
我在网上找到了一些方法,它们确实可以生成双精度随机数,但是精度不如我要求的那么好(小数点后只有6位数字)。
请问如何实现我的目标?
在C++11中,您可以使用<random>
头文件。在这个特定的例子中,我们使用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;
double r = rand()/RAND_MAX;
1/(2<sup>31</sup)-1
- 这应该给你8-9位数字的“精度”随机数。确保使用足够高的精度打印: cout << r << endl;
不行,这样会有问题。使用以下代码更可靠:
cout << fixed << sprecision(15) << r << endl;
const int RAND_MAX_INCL = 32767;
const int RAND_MAX_EXCL = RAND_MAX_INCL + 1;
int iRandomDigit() {
const double dRand = rand()/RAND_MAX_EXCL; // double 0.0 <= dRand < 1.0
return (int)(dRand * 10); // int 0 <= result < 10
};
double dRandom0IncTo1Exc(const int iPrecisionDigits) {
int iPrecisionDigits2 = iPrecisionDigits;
if ( iPrecisionDigits > DBL_DIG ) { // DBL_DIG == "Number of significant decimal digits for double type"
Print("WARNING: Can't generate random number with precision > ", DBL_DIG, ". Adjusted precision to ", DBL_DIG, " accordingly.");
iPrecisionDigits2 = DBL_DIG;
};
string sDigits = "";
for (int i = 0; i < iPrecisionDigits2; i++) {
sDigits += (string)iRandomDigit();
};
const string sResult = "0." + sDigits;
const double dResult = StringToDouble(sResult);
return dResult;
}
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;
x
的机会是否应该取决于值x
的大小?如果不是,那么在0.25和0.5之间获得结果的机会将等于在0.5和1之间获得结果的机会。 - MSalters