r - 为什么 runif() 的唯一值比 rnorm() 少?
问题描述
如果您运行如下代码:
length(unique(runif(10000000)))
length(unique(rnorm(10000000)))
您会看到只有大约 99.8% 的 runif 值是唯一的,但 100% 的 rnorm 值是唯一的。我认为这可能是因为范围受限,但是将 runif 的范围提高到 (0, 100000) 并不会改变结果。连续分布应该有重复的概率= 0,我知道浮点精度不是这种情况,但我很好奇为什么我们看不到两者之间的重复次数相当接近。
解决方案
这主要是由于默认 PRNG 的属性(即使 RNG 没有,runif
它的范围更小,因此可表示的值的数量也更少,在某些时候也可能产生类似的效果)。rnorm
在以下内容中进行了一些倾斜的讨论?Random
:
不要依赖来自 RNG 的低阶位的随机性。大多数提供的统一生成器返回转换为双精度的 32 位整数值,因此它们最多采用 2^32 个不同的值,长时间运行将返回重复值(Wichmann-Hill 是例外,并且都给出至少 30 个不同的值位。)
举个例子:
sum(duplicated(runif(1e6))) # around 110 for default generator
## and we would expect about almost sure duplicates beyond about
qbirthday(1 - 1e-6, classes = 2e9) # 235,000
更改为 Wichmann-Hill 生成器确实减少了重复的机会:
RNGkind("Wich")
sum(duplicated(runif(1e6)))
[1] 0
sum(duplicated(runif(1e8)))
[1] 0
推荐阅读
- javascript - 解构内部反应组件的最佳方法?
- python - 在张量流中使用会话和仅使用会话有什么区别
- javascript - 如何将搜索到的数据从数据库传输到具有完整数据行的另一个表?
- html - Flexbox Layout & Grid Layout 让我的 html 不那么语义化
- c# - 如何在源代码中安全地存储密码?
- angular - 数据未通过组件类方法绑定
- python - 从 Spyder 中导入 PyQ 会导致内核死机
- javascript - 在 nodejs express 中拆分文件时出现一些错误
- c++ - c ++类实现接口,接口具有采用实现该接口的任何类的方法
- scala - Sbt 下载依赖,但 IntelliJ 无法解析其用法