我对R语言还不熟悉,但是文档上说runif(n)返回的数字范围在0到1之间,包括1。
我认为应该是0 <= runif(n) < 1,包括0而不包括1。
我用n=100,000,000测试了一下,发现它从未生成过0或1。我知道在浮点数中实际命中特定值的概率非常小,但是...(在双精度中0到1之间有大约2^53个值)。
因此,我查看了R的源代码,在r-source-trunk\src\nmath\runif.c中找到了答案。
我用n=100,000,000测试了一下,发现它从未生成过0或1。我知道在浮点数中实际命中特定值的概率非常小,但是...(在双精度中0到1之间有大约2^53个值)。
因此,我查看了R的源代码,在r-source-trunk\src\nmath\runif.c中找到了答案。
do
{
u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;
所以,尽管有文档说明,它永远不会返回0或1。
这难道不是一个bug吗?
或者至少是文档存在问题吗?
2^32
个值(尽管其循环大小要大得多),因此您无论如何也不会获得所有可表示的2^53个值。您阅读的文档可能会这样说,因为在概率文献中,均匀随机变量通常被描述为具有类似于[a,b]
而不是(a,b)
的支持。 - John Coleman?RNG
很清楚内置生成器返回2^32
(或更少)个不同的值。我猜测 R 之所以这样做是出于效率方面的考虑。对于一些蒙特卡罗应用程序,随机数生成是主要的瓶颈,并且使用连续的值可能会将整个算法的速度降低近2倍。如果这真的是一个问题,用户可以指定不同定义的 RNG 的方式。肯定会有一些包提供了一个64位的twister。 - John Coleman