一道有趣的条件概率题

题目:

现在你不断扔一个等概率的六面骰子,直到扔出 \(6\) 停止。求在骰子只出现过偶数的条件下扔骰子次数的期望。

题解:

既然每一次都只能是偶数,也就是只能出现 \({2,4,6}\),且出现 \(6\) 就停,那么答案就是 \(3\) ?但是答案不是 \(3\)。答案是 \(\frac{3}{2}\)

问题的关键在于要意识到,扔出奇数后相当于实验马上失败了,而不是这次扔出的奇数无效,重新扔。

这个问题等价于:假设你不断扔一个等概率的六面骰子,直到扔出\(1, 3, 5, 6\)停止。求最后一次扔出 \(6\) 的条件下扔骰子次数的期望。

考虑最原始的做法,即直接按照定义算。令概率空间 \(U\)\([6]^*\) 所有无限长的字母表为 \([6]^*\) 的字符串。令 \(\mathcal{E}\) 表示第一个 \(6\) 出现之前都是偶数这个事件,有:

$$\Pr[\mathcal{E}] = \frac{1}{6} \times \left (1 + \frac{1}{3} + \left( \frac{1}{3}\right)^2 + \cdots \right) = \frac{1}{4}.$$

\(f(x)\) 为字符串 \(x\) 中第一个 \(6\) 出现的位置,直接代入定义有:

$$\mathbb{E}X[f(X) | \mathcal{E}] = \frac{1}{\Pr[\mathcal{E}]} \int{x \in \mathcal{E}} \Pr[X = x] f(x) \mathrm{d} x = 4 \times \frac{1}{6} \times \sum_{i=1} \left( \frac{1}{3} \right)^{i-1} i = \frac{3}{2}.$$

代码验证:

#include <bits/stdc++.h>

using namespace std;

int random_roll() {
  int n = rand() % 6 + 1;
  // std::cout << n << '\n';
  return n;
}
double game(int cnt = 0) {

  if(cnt == 0) cnt = 1;
  int t = random_roll();
  if(t % 2 == 1) { // 奇
    return 0;
  }
  else if(t == 6) {
    return cnt;
  }
  else {
    return game(++cnt);
  }
}
double expect(int n) {
  double fenzi = 0.0, fenmu = 0.0;
  for(int i = 1; i <= n; i++) {
    double t = game(); // 扔出奇数时为 0
    // std::cout << "t = " << t << '\n';
    if(t == 0) {
      continue;
    }
    else {
      fenzi += t;
      fenmu += 1.0;  // 扔出偶数时加一
    }
  }
 // 假设你不断扔一个等概率的六面骰子,直到扔出6停止。求在骰子只出现过偶数的概率? 1/4 = 0.25
  printf("%.8f\n", fenmu / n);
  return fenzi / fenmu;
}
int main(int argc, char const *argv[]) {
  srand((unsigned int)time(0));
  printf("%.8f\n", expect(10000)); // 3 / 2 = 1.5
  return 0;
}

posted @ 2018-10-13 16:40  LzyRapx  阅读(1018)  评论(0编辑  收藏  举报