为什么runif()的唯一值比rnorm()小?

时间:2018-07-19 14:47:13

标签: r random

如果您运行以下代码:

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

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

2 个答案:

答案 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确定普通生成器, >