n个骰子的点数

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

 

你可能感兴趣的:(n个骰子的点数)