如果您运行以下代码:
length(unique(runif(10000000)))
length(unique(rnorm(10000000)))
您会看到,只有大约99.8%的runif值是唯一的,但rmrm值却是100%。我以为这可能是因为范围受限制,但是将runif的范围提高到(0,100000)不会改变结果。连续分布应该具有重复= 0的概率,我知道不是这样,但我很好奇为什么我们看不到两者之间的重复次数相当接近。
答案 0 :(得分:3)
这主要是由于默认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
答案 1 :(得分:2)
生成随机数的documentation说:
不要依赖来自RNG的低位比特的随机性。大部分的 提供的统一生成器返回的32位整数值是 转换为双精度,因此它们最多采用2 ^ 32个不同的值, 长期运行将返回重复的值(Wichmann-Hill是 例外,并且都给出至少30个不同的比特。)
通过birthday paradox,您将希望看到一组重复的值,这些重复的值大约超过2 ^ 16个值,以及10000000> 2 ^ 16。我没有在文档中直接找到关于将返回多少个不同值rnorm
的任何内容,但是它可能大于2 ^ 32。有趣的是,set.seed
具有不同的参数kind
和标准生成器,normal.kind
确定统一生成器,而lpad
确定普通生成器, >