重启随机生成器相当于重启bernoulli进程?

时间:2015-11-01 02:09:43

标签: matlab simulation bernoulli-probability

我想模拟伯努利过程。我投了N次硬币

initRand();
p = 0.5;
for ( int i=0; i<N; i++) {
  x = rand(); 
  if ( x < p ) success();
  else failure();
}

现在有两种情况:

(i)此时我继续投币直至2 * N:

for (; i<2*N; i++) {
  x = rand(); 
  if ( x < p ) success();
  else failure();
}

(ii)这里我重新开始随机序列并继续下降到2 * N:

initRand();
for (; i<2*N; i++) {
      x = rand(); 
      if ( x < p ) success();
      else failure();
}

在第一种情况下,k次成功超过2 * N投掷的概率计算为

P(success)=nchoosek(2*N,k)*p^k*(1-p)^(2*N-k)

第二种情况是否正确?或者由于发电机复位,我们不能将2 * N周期视为单个过程?

2 个答案:

答案 0 :(得分:2)

通常,答案取决于所使用的伪随机数生成器(PRNG)算法以及initRand的实现方式。

PRNG旨在生成一系列值,这些值在统计上模仿独立和相同分布。他们的成功程度差异很大。所有PRNG都保持一些内部状态,通过算法更新以生成下一个值。播种发电机意味着选择初始状态。 Matlab的默认生成器是Mersenne Twister(mt19937),这种情况非常好。如果你在没有重置的情况下提前充电,你的伯努利试验似乎是独立的。

这让我们想到initRand的问题。由于那不是内置的Matlab,我不知道你正在使用的那个是如何实现的。如果它在每次调用时将PRNG设置为相同的状态,那么您的两个序列将最终完全相互关联。如果它基于局部熵选择任意种子状态,则仍然可能产生一些重叠的序列,并且结果将部分相关。好消息是,在大小为2 19937 -1的状态空间中,在Mersenne Twister中看到这种情况的可能性是令人难以置信的低。但是,如果它根据时间选择种子并且程序运行得足够快,那么这两个序列可能会在时钟的相同时钟中播种,并最终会相同。

完成所有操作后,最安全的选择是不要在中途重置initRand状态。

答案 1 :(得分:0)

算法生成的所有数字都只是伪随机数。因此,重置算法将使您处于预定的随机数序列的开头。

这意味着,如果(i),您将拥有一系列2*N个数字,这些数字可被视为独立的随机过程。

但是,如果您在(ii)中重置算法,您将获得第一次绘制的相同N个数字。这些数字仍来自相同的随机分布,但第一个N数字与第二个N数字相关联。因此,成功的可能性将取决于第一个N条目,而不是所有2*N