以下代码能够计算每种两个骰子之和的准确概率分布:
int SIDES = 6;
double[] dist = new double[2 * SIDES + 1];
for (int i = 1; i <= SIDES; i++)
for (int j = 1; j <= SIDES; j++)
dist[i + j] += 1.0;
for (int k = 2; k <= 2 * SIDES; k++)
dist[k] /= 36.0;dist[i]的值就是两个骰子之和为i的概率。
用实验模拟N次掷骰子,并在计算两个1到6之间的随机整数之和时记录每个值的出现频率以验证它们的概率。N要多大才能保证你的经验数据和准确数据的吻合程度达到小数点后三位?
实验代码:
import edu.princeton.cs.algs4.*;
public class fly {
public long test() {
// 记录试验次数
long N = 0;
// 计算每种两个骰子之和的准确概率分布
int SIDES = 6;
double[] dist = new double[2 * SIDES + 1];
for (int i = 1; i <= SIDES; i++)
for (int j = 1; j <= SIDES; j++)
dist[i + j] += 1.0;
for (int k = 2; k <= 2 * SIDES; k++)
dist[k] /= 36.0;
// 保存实验结果
double[] probaility = new double[13];
// 比较实验情况和真实情况,得到N值
while (true) {
N++;
int a = StdRandom.uniform(1, 7);
int b = StdRandom.uniform(1, 7);
probaility[a + b] = probaility[a + b] + 1.0;
for (int i = 0; i < 11; i++) {
if (Math.abs(probaility[i + 2] / N - dist[i + 2]) < 0.001) {
if (i == 10) {
StdOut.print(N);
return N;
}
continue;
}
break;
}
}
}
public static void main(String[] args) {
new fly().test();
}
}经过多次实验表明,N的值处于数十万级别。
这段代码通过实验模拟掷骰子N次,计算并验证两个骰子和的准确概率分布。通过记录每次投掷结果的频率,评估当N足够大时,经验数据与理论概率的吻合程度。

8927

被折叠的 条评论
为什么被折叠?



