p[i][j]表示i个骰子,总和为j的概率,利用p[i][j]与p[i-1][j-1],p[i-1][j-2]...p[i-1][j-6]之间的关系进行求解。
代码如下:
//计算n个骰子,掷出的和的所有概率
//例如,输入:1
//输出:
//1:0.166667
//2:0.166667
//3:0.166667
//4:0.166667
//5:0.166667
//6:0.166667
#include<iostream>
#include<math.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n < 1) {
return -1;
}
double p[100][1000] = {0.0};
int i=0;
int j=0;
for (i = 1; i < n + 1;i++) {
p[i][i] = pow(1.0/6,i);
}
p[1][1] = 1.0 / 6;
p[1][2] = 1.0 / 6;
p[1][3] = 1.0 / 6;
p[1][4] = 1.0 / 6;
p[1][5] = 1.0 / 6;
p[1][6] = 1.0 / 6;
for (i = 2; i < n + 1;i++) {
//j<=6时,p[i][j]为p[i - 1][i-1]~p[i - 1][j-1]的累加和
for (j = i + 1; j <= 6;j++) {
double tmp = 0.0;
for (int z = i - 1; z < j;z++) {
tmp += p[i - 1][z]/6.0;
}
p[i][j] = tmp;
}
//j>=7时,p[i][j]为p[i - 1][j - 1]~p[i - 1][j - 6]的累加和
for (j = 7; j < 6 * n + 1;j++) {
p[i][j] = (p[i - 1][j - 1] + p[i - 1][j - 2] + p[i - 1][j - 3] + p[i - 1][j - 4] + p[i - 1][j - 5] + p[i - 1][j - 6]) / 6.0;
}
}
for (j = n; j < 6 * n + 1;j++) {
cout << j << ":" << p[n][j] << endl;
}
return 0;
}
本文介绍了一个使用动态规划算法计算任意数量骰子投掷结果概率的程序。通过递推公式建立了不同骰子数目与投掷结果之间的概率关系,并给出了完整的C++实现代码。
8万+

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



