无偏地掷 n 个硬币,每个硬币的成功值不同

Unbiased coin toss of n coins with different success values for each coin

假设我们有 n 个硬币,硬币 i 正面朝下的概率是 f(i) 。 求将 n 枚硬币全部抛完,出现偶数次正面朝上的概率。

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

这里的n很大,数量级为1e5,所以需要高效的方法。

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

然后我想以某种方式应用期望线性度,但无法想出任何有用的方法。

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

设 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) 确实非常接近 .5

V(10000) = 0.500075