骰子个数为1:则点数和与次数的关系是: 0:0 1:1 2:1 3:1 4:1 5:1 6:1
骰子个数为2:则点数和与次数的关系是:0:0 1:0 2:1 3:2 4:3 5:4 6:5 7:6 8:5 ...
...
每增加一个骰子,则第i个元素的值,是其头6个的和
代码如下:
#include<iostream>
#include<math.h>
#include <iomanip>
using namespace std;
const int g_maxValue = 6;
void PrintProbability(int number){
if(number < 1){
return;
}
int* pProbabilies[2];
pProbabilies[0] = new int[g_maxValue * number + 1];
pProbabilies[1] = new int[g_maxValue * number + 1];
for(int i = 0; i < g_maxValue * number + 1; ++i){
pProbabilies[0][i] = 0;
pProbabilies[1][i] = 0;
}
int flag = 0;
//当只有一个骰子时,每个值出现的次数都为1
for(int i = 1; i <= g_maxValue; ++i){
pProbabilies[0][i] = 1;
}
//其他骰子
for(int i = 2; i <= number; ++i){
//i个骰子,则0~i-1出现的次数为0
for(int j = 0; j < i; ++j){
pProbabilies[1-flag][j] = 0;
}
//i个骰子,从第i个开始算起
for(int j = i; j <= g_maxValue * i; ++j){
pProbabilies[1-flag][j] = 0;
// 累加 i-1 i-2 i-3 ... i-6个和
for(int k = 1; k <= g_maxValue && k <= j; ++k){
pProbabilies[1-flag][j] += pProbabilies[flag][j-k];
}
}
flag = 1 - flag;
}
double total = pow((double)g_maxValue, number);
for(int i = number; i <= g_maxValue * number; ++i){
double ratio = (double)pProbabilies[flag][i]/total;
cout << i << ":"<< (double)pProbabilies[flag][i] << "/" << total << " " <<setw(10) << ratio << endl;
}
delete pProbabilies[0];
delete pProbabilies[1];
}
int main(){
PrintProbability(2);
return 0;
}