我最近发现了一些让我烦恼的事情......
我使用RANMAR算法生成随机数。据说它是目前最好的算法(如果你知道更好的算法,请告诉我)。
我真的很惊讶地注意到它能产生的最小双倍大约是1e-8。
所以我尝试使用std::rand()
使用常见的
(double)rand() / RAND_MAX;
生成双倍的方式,我注意到最小的数字大约是1e-9。我有点理解,在这种情况下,因为1.0/RAND_MAX
大致是1.0/2^31 ~ 1e-9
(在我的计算机上,我知道RAND_MAX
可以有不同的值。)
因此我想知道是否有可能在[0:1]
之间生成随机双倍,其中可能的最小值接近机器精度。
[编辑]
我只想更精确......当我说生成的最小数字是1e-9
时,我也应该说下一个是0
。因此,1e-9
和0之间存在巨大差距(无穷大数字),将被视为0
。我的意思是,如果你做以下测试
double x(/*is a value computed somehow in your code that is small ~1e-12*/);
if(x>rand()){ /*will be true for all random number generated that are below 1e-9*/}
所以这个条件对于太多的数字都是正确的......
[/编辑]