凭直觉,人们可能会编写一个随机 double 生成器,如下所示:
double randDouble(double lowerBound, double upperBound)
{
double range = upperBound - lowerBound;
return lowerBound + range * rand();
}
假设我们假设 rand()
在区间 [0, 1) 上返回均匀分布的伪随机 double 值。
此方法是否保证返回 [lowerBound, upperBound) 内具有均匀概率分布的随机 double 值?我特别感兴趣的是浮点计算的性质是否可能导致某些范围的最终分布出现尖峰或下降。
最佳答案
首先,rand() 生成伪随机数字,而不是真正的随机数。因此,我假设您询问您的函数是否生成指定范围内的伪随机数。
其次,正如 Oli Charlesworth 所说,许多 rand 实现返回 0 到 RAND_MAX 之间的数字,其中 RAND_MAX 是它可以取的最大可能值。在这些情况下,您可以通过以下方式获取 [0, 1) 中的值
double r = rand()/((double)RAND_MAX+1);
+1
的存在使得 r 不能为 1。
其他语言的 rand 返回 0 到 1 之间的值,在这种情况下您不需要进行上述除法。不管怎样,事实证明你的函数返回了随机分布的一个不错的近似值。有关更多详细信息,请参阅以下链接:http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html请注意,此链接为您提供了略有不同的功能,他们声称这些功能更好一点,但您拥有的功能可能已经足够好了。
关于language-agnostic - 这个随机双生成器能工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116008/