1

我想模拟伯努利过程。我丢了 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();
}

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

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

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

4

2 回答 2

2

一般来说,答案取决于使用的伪随机数生成器 (PRNG) 算法以及如何initRand实现。

PRNG 旨在产生一系列在统计上模拟独立且同分布的值。他们成功的程度差别很大。所有 PRNG 都维护一些内部状态,这些状态会通过算法更新以产生下一个值。播种生成器意味着选择初始状态。Matlab 的默认生成器是 Mersenne Twister (mt19937),就这样的事情而言,它非常好。如果您在不重置的情况下向前冲锋,您的伯努利试验将看起来是独立的。

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

当一切都说完了,你最安全的选择是不要initRand在中途重置状态。

于 2015-11-01T16:57:06.143 回答
0

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

这意味着在情况(i)中,您将拥有一个2*N数字序列,可以将其视为一个独立的随机过程。

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

于 2015-11-01T04:47:46.670 回答