提供一个不用舍弃任何结果、且每掷一次就试验一次的方法。
第 n 次掷骰子时,获得 \left[ 1, 6 \right] 范围内的一个随机整数 r,记 S_{n}=S_{n-1}+r(令 S_{0}=0)。如果 S_{n} 除以 7 的余数为 0,则认为事件发生。
改进: S_{n}=S_{n-1}+K\cdot r+B ,其中 K 和 B 是常数。通过恰当地设置这两个常数,可避免已知上一次发生可推导下一次必然不发生,以及首次必然不发生的问题。
理论解释:虽然看起来每次试验都跟上一次试验相关,但由于存在掷骰子这个随机行为,所以结果仍然是随机的。
下面是一个模拟程序,测试这个方法的效果。
int N = 100_000_000;
int K = 2;
int B = 5;
long S = 0;
int c = 0;
for (int n = 1; n <= N; n++)
{
S += K * Random.Shared.Next(1, 7) + B;
if (S % 7 == 0) c++;
}
Console.WriteLine(c / (double)N);
运行 3 次结果为:0.14285887,0.14274658,0.1428576。(1 / 7 = 0.142857)
编辑于 2023-11-14 22:46・IP 属地四川