我一直在研究基本R的RNG,并且好奇是否可以将Mersenne-Twister的32位实现在将其缩放到所需的大量随机数时对其进行限制,所以我做了一个简单的测试:
set.seed(8)
length(unique(runif(1e8)))
# [1] 98845641
1e8 - 98845641
# 1154359
所以事实证明,这1亿张抽奖中确实有很多重复。
当我切换到dqrng
包实现的MT RNG的64位版本时,问题没有出现。
所引用的64位是指所使用的浮点数的类型?
我是正确的结论是,由于可能的数字范围较大(64位FP与32位FP),使用64位MT时重复的可能性较小?
答案 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
这与您获得的结果非常接近。