我在整理随机双精度数只有一个小数点时遇到一些问题。我已经在线上看了一下,据我所能了解和理解的,我一切都正确。但是显然不是。具体来说,似乎我可能使用了不正确的“ round()”,因为即使我不对其进行所有其他乘法运算(等),它也不会四舍五入。
double u;
srand(unsigned(time(NULL)));
for(int i = 0; i < 10; i++){
u = (double)rand()/(RAND_MAX+1) + (rand()%101); //Acquire random number, turn it into decimal and then add it to another number between 0-100.
u *= 10; //Shift numbers left to remove first decimal from round.
round(u); //Round to nearest whole number.
u /= 10; //Shift right to return the first decimal.
cout<<u<<" "<<flush;
}
这种方法对我来说似乎很糟糕。显然,它不会在double的更高范围内起作用(因为* 10可能会使它过载,或者不管它叫什么)。我希望有人:
A.告诉我该代码在哪里出错,或者提示它。
B.建议一种更好,更有效的方法。我确定肯定有一个。
C.让我四舍五入到小数点后一位。
并提前感谢!
我不知道为什么要std::rand()
继续推荐它,因为它的表面上的简单性令人误解,并且我们在过去五年中拥有更好的工具。
C ++ 11随机生成器更易于正确使用,并且在统计上您会获得更好的结果。如果需要,您还可以选择不同的引擎和发行版。
// Setup
std::default_random_engine generator;
generator.seed(/* truly random seed, e.g. from std::random_device */);
std::uniform_real_distribution<double> distribution(/* your range */);
// Usage
double randomNumber = distribution(generator);
double rounded = std::round(10. * randomNumber) / 10.;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句