可能存在的问题:随机数生成器

3

我需要从整数序列中生成一定数量的随机数,我使用以下代码:result<-sample(x=c(2:50), size=10e6, replace=T)。 我发现如果向量x的长度为奇数,那么增加结果向量的长度(最长为10^6),则随机数不是随机分布。 当绘制result的直方图时,通常会发现序列的第一个数字(在本例中为“2”)具有始终高于其他列的列(和因此元素数目)列。 如果x=c(1:50),因此向量x的长度为偶数,则随机生成器的行为似乎正常。 在R 3.0.1下使用Ubuntu 13.10时,是否存在与此奇怪结果有关的随机数生成器问题?


7
R的随机数生成器没有问题。你只是对hist如何进行分箱感到困惑。如果你查看table的结果,就会发现没有任何问题。 - joran
3个回答

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中的第一个箱似乎包含所有2、3和4的值。这是因为hist默认使用一些“模糊化”技术对箱边界进行分组,导致前两个断点略小于2.0,略大于4.0。再加上区间右侧为闭合区间,就得到了结果直方图。
与之比较:
hist(result,breaks = 1:50)

在此输入图片描述


4
这可能是一个离题的技术讨论,但如果您对默认的(Mersenne Twister)伪随机数生成器不满意,请尝试切换到另一个,参见?RNGkind。然而,已知MT19937通过了许多非常严格的测试(如Marsaglia的Diehard测试电池或TestU1),因此您的代码很可能存在问题。
无论如何,如果您的代码没有问题(编辑:我们知道这不是事实),您将获得一个测试RNG随机性的好方法(其中MT表现不佳)。无论如何,这至少在理论上可能是正确的,因为没有完美的生成器。
关于随机数生成和RNG测试的一个好的介绍是:James E. Gentle的《Random Number Generation and Monte Carlo Methods》。

2
非常有用,但与此问题(即hist()的代码/理解问题)并不相关。 - Ben Bolker

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,这意味着第一个区间包括2、3和4的频率。接下来的区间只有两个值,而第一个区间有3个值,因此您会在直方图中看到峰值。

谢谢大家,所以这是hist函数的问题,而不是随机数生成器的问题。 - Nicola Dinapoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接