【问题标题】:Unbiased coin toss of n coins with different success values for each coinn 个硬币的无偏抛硬币,每枚硬币具有不同的成功值
【发布时间】:2018-01-25 17:18:52
【问题描述】:

假设我们有 n 个硬币,硬币 i 正面朝上的概率是 f(i)。 找出当所有 n 个硬币都被掷出时出现偶数正面的概率。

f(i) = 1 / (2i + 3)

这里 n 很大,大约为 1e5,因此需要有效的方法。

我试图分析蛮力案例,但这太过分了,即如果我计算 2 次成功、4 次、6 次...,可能需要数年时间才能运行。

然后我想以某种方式应用期望线性度,但想不出任何可以提供帮助的方法。 ​​

【问题讨论】:

  • 近似值是否足够好?我怀疑结果将非常接近 1/2。要获得确切的结果,请考虑 2 个状态的马尔可夫链,分别命名为奇数和偶数。如果硬币 i = 正面,则存在从奇数到偶数或从偶数到奇数的过渡。如果硬币 i = 反面,您将保持相同的状态。每次抛硬币都会给出一个转换矩阵,n = 1e5 步转换矩阵就是 m(1) 的乘积。米(2)。米(3)...米(1e5)。转移概率由您提到的函数 f 给出。您可以轻松找到该产品;它只是 2x2 转换矩阵的乘积。
  • @RobertDodier 确实非常接近 0.5,尽管我使用了递归(这是让马尔可夫链运行的另一种方法)

标签: probability


【解决方案1】:

这应该是简单的递归,不是吗?

让我们 p(k) = 1/(2*k+3), q(k) = 1 - p(k), V(k) 是在 k 之后出现偶数抛掷的概率。

让我们考虑最后一次投掷

V(n) = q(n)*V(n-1) + p(n)*(1-V(n-1)) = (q(n)-p(n))*V(n-1) + p(n)
V(0) = 1

C++ 代码

#include <iostream>

inline double p(int k) {
    return 1.0/(2.0*k + 3.0);
}

inline double q(int k) {
    return 1.0 - p(k);
}

double V(int k) {
    if (k == 0)
        return 1.0;

    return (q(k) - p(k))*V(k-1) + p(k);
}

int main() {
    std::cout << V(10000) << std::endl;

    return 0;
}

V(10000) 确实非常接近 0.5

V(10000) = 0.500075

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 2016-01-24
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多