R随机数发生器有问题吗?

时间:2018-10-27 18:02:47

标签: r random

我一直在研究基本R的RNG,并且好奇是否可以将Mersenne-Twister的32位实现在将其缩放到所需的大量随机数时对其进行限制,所以我做了一个简单的测试:

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

所以事实证明,这1亿张抽奖中确实有很多重复。

当我切换到dqrng包实现的MT RNG的64位版本时,问题没有出现。

问题1:

所引用的64位是指所使用的浮点数的类型?

问题2:

我是正确的结论是,由于可能的数字范围较大(64位FP与32位FP),使用64位MT时重复的可能性较小?

1 个答案:

答案 0 :(得分:8)

来自?Random

  

不要依赖来自RNG的低位比特的随机性。提供的大多数统一生成器都返回32位整数值,这些值将转换为双精度型,因此它们最多使用2 ^ 32个不同的值,长期运行将返回重复的值。

实际上,当我们计算expected number of draws that have a duplicate时,我们得到了

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

这与您获得的结果非常接近。