程序设计思路:
假设有n个骰子,关键是需要统计每个点数出现的次数。首先分析第一个骰子点数和有1到6的点数,计算出1到6的每种点数 的次数,并将结果用一个数组pos1记录。然后分析有两个骰子时, 点数为K肯定是由上一次中点数为K-1,K-2,K-3,K-4,K-5,K-6的点数产生,即此时点数为K的次数为上一次点数为 K-1,K-2,K-3,K-4,K-5,K-6的次数之和,将本次计算的结果保存到另外一个数组pos2中,这样一直计算到n个骰子时,数组pos2中保存的值即为每个点数出现的次数。
技巧:
假设出现的点数为K,则将其出现的次数保存到pos[K]中;由n个骰子的点数来推出n+1个骰子的点数分布时,在计算出n+1个骰子的点数分布后,需要将上面提到的pos1数组清空,并且将pos2复制到pos1,然后再将pos2清空。
程序代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 |
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <time.h> using
namespace std; #define N 50 int
num1[N] , num2[N] ; void
Show( int
n); int
main() { int
n ; cin>>n ; Show(n); return
0; } void
Show( int
n){ memset (num1,0,N* sizeof ( int )); memset (num2,0,N* sizeof ( int )); for ( int
i = 1 ; i <= 6 ; i++) num1[i] = 1 ; int
i , j , k ; for (i = 2 ; i <= n ; i++){ for (j = i ; j <= 6*i ; j++){ k = j-6 ; if (k < i) k = i-1 ; for ( ; k < j ; k++) num2[j] += num1[k]; } memset (num1,0,N* sizeof ( int )); for ( int
m = i ; m <= 6*i ; m++) num1[m] = num2[m]; memset (num2,0,N* sizeof ( int )); } cout<< "The probability distribution of " <<n<< " dices" <<endl<<endl; cout<< "Point: \t" << "Probability:" <<endl;; for ( int
kkk = n ; kkk <= 6*n ; kkk++){ cout<<kkk<< ": \t" <<num1[kkk]<< "/" <<( pow (6.0,n))<<endl; } } |
说明:本程序试用于1-8个骰子的概率分布,如果需要增大骰子的数目,可以修改宏定义中的N值(N = 6*n +1 , 其中n为骰子个数)
原文:http://www.cnblogs.com/churi/p/3600655.html