一道有趣的条件概率题

it2022-05-05  112

题目:

现在你不断扔一个等概率的六面骰子,直到扔出 \(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; }

转载于:https://www.cnblogs.com/LzyRapx/p/9783356.html

相关资源:投骰子游戏

最新回复(0)