把n個骰子扔在地上,所有骰子朝上的一面的點數之和為s。輸入n,打印出s的所有可能的值和出現的概率。
解法一:基於遞歸求骰子點數。
1 /////////////////基於遞歸求骰子點數/////////////////////////////////////////////////////////
2 int g_MaxValue = 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 }