首页 > 解决方案 > 为什么 runif() 的唯一值比 rnorm() 少?

问题描述

如果您运行如下代码:

length(unique(runif(10000000)))
length(unique(rnorm(10000000)))

您会看到只有大约 99.8% 的 runif 值是唯一的,但 100% 的 rnorm 值是唯一的。我认为这可能是因为范围受限,但是将 runif 的范围提高到 (0, 100000) 并不会改变结果。连续分布应该有重复的概率= 0,我知道浮点精度不是这种情况,但我很好奇为什么我们看不到两者之间的重复次数相当接近。

标签: rrandom

解决方案


这主要是由于默认 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

推荐阅读