我需要从整数序列开始生成一定数量的随机数,并使用以下代码:result<-sample(x=c(2:50), size=10e6, replace=T)
。我发现增加结果向量的长度(最大长度为10 ^ 6),如果向量x
的长度是奇数,则随机数的分布不是随机的数。当绘制result
的直方图时,我通常会得到序列的第一个数字(在示例中&#39; 2&#39;)有一个列(因此有许多元素)总是高于其他专栏。如果x=c(1:50)
,x
的长度是偶数,则随机生成器的行为似乎没问题。关于这个奇怪的结果,R中的随机数生成器有什么问题吗?我在Ubuntu 13.10下使用R 3.0.1。
答案 0 :(得分:11)
正如我在上面的评论中提到的,这与随机数生成器完全无关。
考虑:
set.seed(123)
result <- sample(x=c(2:50), size=10e4, replace=TRUE)
x <- hist(result)
看起来不对劲,是吗?但仔细看看:
> x$breaks
[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
> x$counts
[1] 6132 3971 4179 4115 4108 4002 4145 4073 4192 4117 4123 4099 4054 4013 4067 4055 4073 4082 4095
[20] 4088 4044 4050 4027 4096
...对比
> table(result)
result
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1979 2100 2053 1978 1993 2152 2027 2058 2057 2074 2034 1991 2011 2075 2070 2067 2006 2047 2145 2019
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
2098 2060 2063 2099 2000 2016 2038 1990 2023 1976 2091 2060 1995 2061 2012 2003 2079 2008 2087 2036
42 43 44 45 46 47 48 49 50
2052 1989 2055 2044 2006 2001 2026 2062 2034
请注意,hist
中的第一个bin似乎包含所有2,3和4值。这是因为hist
使用的默认分箱策略为bin边界添加了一些“模糊性”,这导致前两个断点略小于2.0且略大于4.0。将其与正确关闭的区间相结合,即可得到最终的直方图。
与:比较:
hist(result,breaks = 1:50)
答案 1 :(得分:4)
这可能是一个非主题技术谈话,但如果您对默认(Mersenne Twister)(伪)随机数生成器不满意,请尝试切换到另一个,请参阅?RNGkind
。然而,众所周知,MT19937通过了许多非常严格的测试(如Marsaglia的Diehard测试电池或TestU1),因此最有可能(编辑:现在:肯定)出错用你的代码。
无论如何,如果您的代码已经确定(编辑:再次,我们知道情况并非如此),您将获得的是一个很好的程序来测试RNG的随机性(在哪个MT表现不佳)。无论如何,这可能(至少在理论上)碰巧是真的,没有完美的发电机。
随机数生成和RNG测试主题的一个很好的介绍是:James E. Gentle的随机数字生成和蒙特卡罗方法。
答案 2 :(得分:1)
>table(result)
result
2 3 4 5 6 7 8 9 10 11 12 13 14
203862 203602 204693 204089 203715 203070 204382 204380 204600 203483 204448 204833 203852
15 16 17 18 19 20 21 22 23 24 25 26 27
204510 203639 203328 204017 204385 204699 203519 204518 203278 203941 203994 204531 204685
28 29 30 31 32 33 34 35 36 37 38 39 40
203378 203993 204128 203932 203961 204176 204684 204833 204499 203654 202945 204347 204354
41 42 43 44 45 46 47 48 49 50
204368 204763 203901 204382 203921 204350 203581 203322 204334 204141
使用table命令可以看到频率相当。
>a <- hist(result)
>a
$breaks
[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
$counts
[1] 612157 407804 407452 408980 407931 408685 408149 407345 409084 408037 407219 408525
[13] 408063 408121 407893 408860 409332 406599 408701 409131 408283 408271 406903 408475
$density
[1] 0.03060785 0.02039020 0.02037260 0.02044900 0.02039655 0.02043425 0.02040745 0.02036725
[9] 0.02045420 0.02040185 0.02036095 0.02042625 0.02040315 0.02040605 0.02039465 0.02044300
[17] 0.02046660 0.02032995 0.02043505 0.02045655 0.02041415 0.02041355 0.02034515 0.02042375
$mids
[1] 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
$xname
[1] "result"
$equidist
[1] TRUE
attr(,"class")
[1] "histogram"
请注意,在中断时,值为2然后是4,这意味着它包含第一个bin中2,3和4的频率。下一个箱子只有两个值,而第一个箱子有3个,因此你可以看到直方图中的峰值。