N個骰子的點數和的概率分布


程序設計思路:

N個骰子的點數和的概率分布 - 純真年代 - 馬文浩的博客

    假設有n個骰子,關鍵是需要統計每個點數出現的次數。首先分析第一個骰子點數和有16的點數,計算出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清空。

程序代碼:

 #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為骰子個數)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM