R随机数生成器存在故障?

8

我在研究R语言的随机数生成器(RNG),并且好奇当需要生成大量的随机数时,32位实现的Mersenne-Twister是否会限制其性能。因此,我进行了一个简单的测试:

set.seed(8)
length(unique(runif(1e8)))
# [1] 98845641
1e8 - 98845641
# 1154359

事实证明,在1亿次抽取中确实存在大量重复。

当我切换到由dqrng包实现的64位MT RNG版本时,问题就不会出现。

问题1:

“64位”是指所使用的浮点数类型吗?

问题2:

我的结论是因为可能数字范围更大(64位FP vs 32位FP),在使用64位MT时重复的可能性较小,这是正确的吗?


1
@Roland,如果是这样的话,在不同的伪随机数生成器上执行相同的命令应该会产生类似的结果,但事实并非如此。我认为unique函数执行精确匹配,就像identical函数一样。请尝试使用unique(c(pi, pi + 1e-10)) - RJ-
1个回答

8

来自?Random

不要依赖于RNG的低位随机性。大多数提供的均匀生成器返回32位整数值,这些值转换为双精度浮点数,因此它们最多可以取2^32个不同的值,而长时间运行会返回重复的值。

实际上,当我们计算有重复项的预期抽样次数时,我们得到:

M <- 2^32
n <- 1e8
(n * (1 - (1 - 1 / M)^(n - 1))) / 2
# [1] 1150705

这非常接近您所得到的结果。


最好将完整的参考文献添加到 R 的随机文档中。因为你可能仍然可以使用 "Wichmann-Hill" 算法生成32位唯一数字。RNGkind(kind = "Wichmann-Hill")``1e8 - length(unique(runif(1e8)))=0 - Mankind_008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接