-2

经过大量操作后,我需要获得一个随机值。我明白了,如果我写,例如 1000000 并将其除以 10 100 次,我应该得到一个几乎随机的数字。

double nump = 1000000000;
cout.precision(45);
for (int i = 1; i <= 100; i++) {
    nump = nump / 10;
}
cout << nump;

但是如果我启动这段代码,我每次都会得到相似的数字。有机器的误差在哪里?为什么这么准确?怎么做这样的计算,会导致很大的误差?

4

2 回答 2

8

您误解了浮点精度的含义。这意味着存储在浮点变量(floatdouble)中的值不必与数学分配/计算的值完全相同。发生这种情况是因为并非所有数学实数都可以用浮点类型表示。

这并不意味着当您在同一台机器上的相同构建上对相同的值执行相同的指令时会得到不同的结果。

例如整数值16,777,217不能用 IEE 754 浮点数表示。所以在

float a = 16'777'217;

a在它不是的意义上将是“不准确的” 16'777'217,但它总是具有相同的“不准确”。


我需要得到一个随机值

然后使用 C++11 随机库。

于 2019-09-04T11:32:02.347 回答
2

没有不准确,因此没有随机性。

就像整数是实数的近似值一样,浮点数也是如此。浮点数在实数上的分布甚至在对数空间中,就像整数在实数空间中的分布一样。

当您写一个类似的数字1.234并将其分配给 adouble时,将选择最接近 double1.234。这与将其分配给int选择最接近int0 的位置不同。但原理是一样的。

当您计算时nump / 10;,浮点标准(例如 IEEE754)通常要求选择最接近double结果的值。

如果您需要伪随机数,请使用属于 C++ 标准库的适当函数。

如果你想要真正的随机数,并且非常丰富,那么你可以购买一些硬件来生成它们,否则你可以使用别人的硬件:例如https://qrng.anu.edu.au/

于 2019-09-04T11:38:01.977 回答