我想模拟伯努利过程。我投了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周期视为单个过程?
答案 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
。