如果您运行如下代码:

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


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

最佳答案

这主要是由于默认PRNG的属性所致(runif的范围小于rnorm的事实,因此即使RNG不能实现,较小数量的可表示值在某些时候也可能具有类似的效果。 )。在?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

07-28 03:14