骰⼦点数分布概率问题
今天学习算法的时候碰见⼀个骰⼦点数分布概率的问题:
Dicesimulation.
Thefollowingcodecomputestheexactprobabilitydistribu-tionforthesumoftwodice:
intSIDES=6;
double[]dist=newdouble[2*SIDES+1];
for(inti=1;i<=SIDES;i++)
for(intj=1;j<=SIDES;j++)
dist[i+j]+=1.0;
for(intk=2;k<=2*SIDES;k++)
dist[k]/=36.0;
Thevaluedist[i]erimentstovali-datethiscalculationsimulatingNdicethrows,keepingtrackofthe
frequenciesofoc-currencgedoesNhavetobebefore
yourempiricalresultsmatchtheexactresultstothreedecimalplaces?
其实这道题要做出来的关键就是求出投了n个骰⼦之后所有点数和出现的分布:
先贴代码:
/**
*runexperimentstovalidatethiscalculationsimulatingNdicethrows,
*keepingtrackofthefrequenciesofoccurrenceofeachvaluewhenyoucomputethesumoftworandomintegersbetween1and6.
*HowlargedoesNhavetobebeforeyourempiricalresultsmatchtheexactresultstothreedecimalplaces?
*@authorxiehang
*/
publicclassEx1_1_35{
publicstaticvoidmain(String[]args){
intside=6;
finalintn=3;//numberofdice
doubletotal=(6,n);
int[]a1=newint[6*n+1];//a1isforcalculate
int[]a2=newint[6*n+1];//a2isforstoretheresult
intresult=0;
//forthefirstdice
for(inti=1;i<=side;i++){
a1[i]++;
}
a2=opy(a1);
n("Whenwehave1dice");
rray(a1);
//forthediceafter1
for(inti=2;i<=n;i++){
//eachdicewillscanfromnumber1tothebiggestnumber
for(intk=0;k<6*i+1;k++){
/**
*原理:
*先定义第⼀个骰⼦的所有可能:1-6各出现⼀次
*再接下去的骰⼦进⼊循环:
*已知下⼀次点数k出现的和等于上⼀次的点数为k-1,k-2,k-3,k-4.k-5.k-6出现的和
*e.g.点数7出现的是点数1,2,3,4,5,6出现的和
*以这个原理循环下去
*/
for(intj=1;j<=6;j++){
if(k-j>=0){//k-j相当于上⾯出现的k-1,k-2
result+=a2[k-j];
}
/**
*解释为何要⽤a1,a2两个array操作:
*如果只⽤⼀个a1操作的话,
*前⾯的数变了之后会影响之后的数
*所以要⽤两个array操作
*
*为何不能⽤a1[k]+=a2[k-j]:
*a1[k]之前是有⼀个值的
*所以在加上去也会让结果不正确
*所以引⼊⼀个新的数储存了以后再变0不断转存就可以了
*/
}
a1[k]=result;
result=0;
}
a2=opy(a1);
n("Whenwehave"+i+"dice:");
rray(a2);
}
n("End");
rray(a2);
n("Hereistherate:");
for(inti=1;i<6*n+1;i++){
n("Theratefornumber"+i+"appearsis:"+("%.2f",a2[i]/total*100)+"%");
}
}
}
本文发布于:2022-11-16 22:02:43,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/33948.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |