求解掷n个骰子和的所有情况及对应的概率(C++)

本文介绍了一个使用动态规划算法计算任意数量骰子投掷结果概率的程序。通过递推公式建立了不同骰子数目与投掷结果之间的概率关系,并给出了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值