求解掷骰子n次得到的结果。
程序的思想是:
使用两个数组,轮流存放掷骰子的次数,而数组的下标加1为掷骰子的结果。
第一次掷骰子概率都为1,每次掷骰子第n次结果为另一个数组(上一次掷骰子的结果)中前n-1,n-2,...,n-6的和。
骰子的结果为n~6n,代码如下:
#include <iostream>
using namespace std;
//掷骰子num次得到的结果
const int g_max = 6;//骰子的点数
void PrintProbability(int num)
{
if (num < 1)
return;
int *pProb[2];
pProb[0] = new int[num * g_max + 1];
pProb[1] = new int[num * g_max + 1];
for (int i = 0; i < g_max * num ; ++i)
{
pProb[0][i] = 0;//初始化为0
pProb[1][i] = 0;
}
int flag = 0;
for (int i = 0; i < g_max ; ++i)
{
pProb[flag][i] = 1;//第一次每个为1
}
for (int k = 1; k < num; ++k)
{
flag = 1 - flag;
for (int i = 0; i < num*g_max; ++i)
{
pProb[flag][i] = 0;
//前n次结果相加
for (int j = 0; j < g_max&&(i>j); j++)
{
pProb[flag][i] += pProb[1-flag][i-j-1];
}
}
}
printf("掷骰子%d次得到的结果:次数",num);
for (int i =num-1; i < g_max * num; ++i)
{
printf("%d= %d, ", i+1, pProb[flag][i]);
}
printf("\n结果:概率\n");
double total = pow((double)g_max, num);
for (int i = num - 1; i < g_max * num; ++i)
{
printf("%d = %e, \n", i + 1, pProb[flag][i]*1.0/total);
}
printf("\n");
delete[] pProb[0];
delete[] pProb[1];
}
int main()
{
PrintProbability(2);
PrintProbability(3);
return 0;
}