n个骰子点数全排列
#include <iostream>
using namespace std;
//fuction to list all combinations
void DiceComb(int *NumArray,int n,int flag){
if(flag==n){
for(int i=0;i<n;++i)
cout<<NumArray[i]<<' ';
cout<<endl;
return;
}
for(int i=1;i<=6;++i){
NumArray[flag]=i;
DiceComb(NumArray,n,flag+1);
}
}
void Dice(int n){
if(n<=0) return;
int* NumArray=new int[n];
DiceComb(NumArray,n,0);
delete[] NumArray;
}
int main(){
Dice(3);
}
进一步改造为点数求和求分布律
#include <iostream>
using namespace std;
//get base^exp
int Power(int base,int exp){
int result=1;
while(exp>0){
result*=base;
--exp;
}
return result;
}
//recursion all the combinition and calcu sum
void ProbalityCore(int* list,int* flag,int len,double* res){
if(flag==list+len){
int sum=0;
for(int i=0;i<len;++i)
sum+=list[i];
res[sum-len]++;
return;
}
for(int i=1;i<7;++i){
*flag=i;
ProbalityCore(list,flag+1,len,res);
}
}
void Probality(int n){
if(n<=0) return;
int* list=new int [n];
//define result table
int reslen=6*n-n+1;
double* res=new double[reslen];
for(int i=0;i<reslen;++i)
res[i]=0;
//recursion to modify the result table
ProbalityCore(list,list,n,res);
//divide 6^n to get the probality,then cout
for(int i=0;i<(6*n-n+1);++i){
res[i]/=Power(6,n);
cout<<i+n<<' '<<res[i]<<'\n';
}
//free the dynamic memory
delete[] list;
delete[] res;
}
int main(){
Probality(3);
}
剔除点数组合的版本
void DiceComb(int *SumArray,int n,int flag,int Sum){
if(flag==n){
SumArray[Sum-n]++;
return;
}
for(int i=1;i<=6;++i){
int CurSum=Sum;
CurSum+=i;
DiceComb(SumArray,n,flag+1,CurSum);
}
}
void Dice(int n){
if(n<=0) return;
//initial the SumArray
int SumArrayLen=6*n-n+1;
int* SumArray=new int[SumArrayLen];
for(int i=0;i<SumArrayLen;++i)
SumArray[i]=0;
//recursion helps the SumArray make sence
DiceComb(SumArray,n,0,0);
//cout the result
for(int i=0;i<SumArrayLen;++i)
cout<<i+n<<' '<<SumArray[i]<<endl;
//free the dynamic memory
delete[] SumArray;
}
int main(){
Dice(3);
}
进一步求分布律
int Power(int base,int exp){
int res=1;
while(exp>0){
res*=base;
exp--;
}
return res;
}
void DiceComb(int *SumArray,int n,int flag,int Sum){
if(flag==n){
SumArray[Sum-n]++;
return;
}
for(int i=1;i<=6;++i){
int CurSum=Sum;
CurSum+=i;
DiceComb(SumArray,n,flag+1,CurSum);
}
}
void Dice(int n){
if(n<=0) return;
//initial the SumArray
int SumArrayLen=6*n-n+1;
int* SumArray=new int[SumArrayLen];
for(int i=0;i<SumArrayLen;++i)
SumArray[i]=0;
//recursion helps the SumArray make sence
DiceComb(SumArray,n,0,0);
//cout the result
for(int i=0;i<SumArrayLen;++i)
cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;
//free the dynamic memory
delete[] SumArray;
}
方法2:不用递归
void Dice_2(int n){
if(n<=0) return;
//initialize 2 array
int ArrayLen=n*6+1;
int* res[2];
res[0]=new int [ArrayLen];
res[1]=new int [ArrayLen];
for(int i=0;i<ArrayLen;++i){
res[0][i]=0;
res[1][i]=0;
}
//first dice
for(int i=1;i<7;++i)
res[0][i]=1;
int flag=0;
for(int k=2;k<=n;k++){
//kth dice
for(int j=0;j<k;++j)
res[1-flag][j]=0;
for(int j=k;j<=k*6;++j){
//clear the previous value,essential!
res[1-flag][j]=0;
//set value according to another array
for(int i=j-1;i>=0&&i>=j-6;i--){
res[1-flag][j]+=res[flag][i];
}
}
flag=1-flag;
}
for(int i=n;i<=n*6;i++){
cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';
}
delete[] res[0];
delete[] res[1];
}
完整代码
#include <iostream>
using namespace std;
/*
//fuction to list all combinations
void DiceComb(int *NumArray,int n,int flag){
if(flag==n){
for(int i=0;i<n;++i)
cout<<NumArray[i]<<' ';
cout<<endl;
return;
}
for(int i=1;i<=6;++i){
NumArray[flag]=i;
DiceComb(NumArray,n,flag+1);
}
}
void Dice(int n){
if(n<=0) return;
int* NumArray=new int[n];
DiceComb(NumArray,n,0);
delete[] NumArray;
}
*/
//fuction to
int Power(int base,int exp){
int res=1;
while(exp>0){
res*=base;
exp--;
}
return res;
}
void DiceComb(int *SumArray,int n,int flag,int Sum){
if(flag==n){
SumArray[Sum-n]++;
return;
}
for(int i=1;i<=6;++i){
int CurSum=Sum;
CurSum+=i;
DiceComb(SumArray,n,flag+1,CurSum);
}
}
void Dice(int n){
if(n<=0) return;
//initial the SumArray
int SumArrayLen=6*n-n+1;
int* SumArray=new int[SumArrayLen];
for(int i=0;i<SumArrayLen;++i)
SumArray[i]=0;
//recursion helps the SumArray make sence
DiceComb(SumArray,n,0,0);
//cout the result
for(int i=0;i<SumArrayLen;++i)
cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;
//free the dynamic memory
delete[] SumArray;
}
void Dice_2(int n){
if(n<=0) return;
//initialize 2 array
int ArrayLen=n*6+1;
int* res[2];
res[0]=new int [ArrayLen];
res[1]=new int [ArrayLen];
for(int i=0;i<ArrayLen;++i){
res[0][i]=0;
res[1][i]=0;
}
//first dice
for(int i=1;i<7;++i)
res[0][i]=1;
int flag=0;
for(int k=2;k<=n;k++){
//kth dice
for(int j=0;j<k;++j)
res[1-flag][j]=0;
for(int j=k;j<=k*6;++j){
//clear the previous value,essential!
res[1-flag][j]=0;
//set value according to another array
for(int i=j-1;i>=0&&i>=j-6;i--){
res[1-flag][j]+=res[flag][i];
}
}
flag=1-flag;
}
for(int i=n;i<=n*6;i++){
cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';
}
delete[] res[0];
delete[] res[1];
}
int main(){
Dice(3);
Dice_2(3);
}