我正在研究基础R的RNG,并且很奇怪Mersenne-Twister的32位实现可能会在缩放到需要的大量随机数时限制它,所以我做了一个简单的测试:
set.seed(8)
length(unique(runif(1e8)))
# [1] 98845641
1e8 - 98845641
# 1154359
Run Code Online (Sandbox Code Playgroud)
事实证明,在1亿平局中确实存在许多重复.
当我切换到由dqrng包实现的64位版本的MT RNG时,问题不会出现.
引用的64位是指使用的浮点数的类型?
我是否正确地得出结论,由于可能的数字范围很大(64位FP与32位FP),使用64位MT时重复的可能性较小?
来自?Random:
不要依赖来自RNG的低阶位的随机性.大多数提供的统一生成器返回32位整数值,这些值转换为双精度值,因此它们最多需要2 ^ 32个不同的值,长时间运行将返回重复值.
M <- 2^32
n <- 1e8
(n * (1 - (1 - 1 / M)^(n - 1))) / 2
# [1] 1150705
Run Code Online (Sandbox Code Playgroud)
这与你的结果非常接近.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |