【问题标题】:Is restarting random generator equivalent to restarting bernoulli process?重新启动随机发生器是否等同于重新启动伯努利过程?
【发布时间】:2016-02-01 05:03:23
【问题描述】:

我想模拟伯努利过程。我丢了一个硬币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 周期视为单个进程?

【问题讨论】:

  • 什么是initRand()?
  • 例如c标准库中的srand()

标签: matlab simulation bernoulli-probability


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    说到底,最安全的选择是不要在中途使用initRand 重置状态。

    【讨论】:

    • 我生成 5 个 alpha 字符的随机字符串(仅限小写),我不希望这些随机字符串与已知字符串发生冲突,例如“barbi”。碰撞“成功”的概率为 p=1/26^5(26 个英文字母)。每一代字符串都是一次伯努利试验,因此碰撞次数按二项分布分布,均值等于 N*p。因此,经过 10^10 次试验后,我平均会遇到 841 次碰撞。因此,我不想让 N 达到 10^10,而是在 N=10^5 时停止“实验”。这将防止碰撞。重新播种随机生成器会停止实验吗?
    • 坦率地说,重新播种随机数是一个非常糟糕的主意,除非您真正了解事情的运作方式以及您在做什么。重新播种的正当理由包括可重复性和有意诱导成对观察之间的相关结构。试图让事情“更随机”或“更独立”是错误的,而且往往会适得其反。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多