首页 > 代码库 > n个骰子的点数

n个骰子的点数

把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。

解法一:基于递归求骰子点数。

 1 /////////////////基于递归求骰子点数/////////////////////////////////////////////////////////
 2 int g_MaxValue = http://www.mamicode.com/6 ;//骰子的点数个数
 3 void Probability(int original , int current , int sum , int* pProbabilities)//original表示骰子个数,current表示剩余骰子的个数,sum表示当前和的一种情况,pProbabilities是存储相同和出现的次数。
 4 {
 5     if (current == 0)
 6     {
 7         pProbabilities[sum - original]++ ;//数组的下标就是当前和减去最小和的值,数组里存储的是当前和出现的次数。
 8     }
 9     else
10     {
11         for (int i = 1 ; i <= g_MaxValue ; i++ )
12         {
13             Probability(original , current - 1 , sum + i , pProbabilities);
14         }
15     }
16 }
17 
18 void Probability(int number , int* pProbabilities)
19 {
20     int sum = 0 ;
21     Probability(number , number , sum , pProbabilities);
22 }
23 
24 void PrintProbability(int number)
25 {
26     if (number < 1)
27     {
28         return;
29     }
30     int MaxSum = number * g_MaxValue ;//最大的和
31     int size = MaxSum - number + 1 ;//和的可能情况数
32     int* pProbabilities = new int[size];
33     for (int i = 0 ; i < size ; i++)
34     {
35         pProbabilities[i] = 0 ;//初始化为0
36     }
37     Probability(number , pProbabilities);
38     double total = pow((double)(g_MaxValue) , number);//和的组合情况
39     for (int i = 0 ; i < size ; i++)
40     {
41         double ratio = pProbabilities[i] / total ;//概率
42         cout<< i + number<<" : "<<pProbabilities[i] <<" : "<<ratio<<endl ;
43     }
44 
45 }