基于JavaScript伪随机正态分布代码实例
这篇文章主要介绍了基于JavaScript伪随机正态分布代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在游戏开发中经常遇到随机奖励的情况,一般会采取先生成数组,再一个一个取的方式发随机奖励。
下面是js测试正态分布代码:
Yourbrowserdoesnotsupportthecanvaselement. Yourbrowserdoesnotsupportthecanvaselement. vartimesArr=[]; vartimesArrObj={}; window.onload=function(){ //for(varmeter=0;meter<800;meter++){ //vartimes=getNumberInNormalDistribution(20,7); //addPoint(times,meter); //timesArr.push(Math.floor(times)); //} //drawGreenTab(timesArr,1); //drawLine(0,380,800,380); drawResult(1); drawResult(2); drawResult(0); drawGreenTab(timesArrObj[1],1); drawGreenTab(timesArrObj[2],2); drawGreenTab(timesArrObj[0],0); } //制作绿色柱状图表 functiondrawGreenTab(timesArr,color){ vartimesTypes={}; for(variintimesArr){ vartimes=timesArr[i]; if(timesTypes[times]==null){ timesTypes[times]=0; }else{ timesTypes[times]=timesTypes[times]+1; } } for(variintimesTypes){ drawRect(i,timesTypes[i],4,color); } } //画圆点 functionaddPoint(y,x,color){ y=400-y; varc=document.getElementById("myCanvas"); varcxt=c.getContext("2d"); if(color==null){ cxt.fillStyle="#FF0000"; }else{ cxt.fillStyle=color; } cxt.beginPath(); cxt.arc(x,y,2,0,Math.PI*2,true); cxt.closePath(); cxt.fill(); } varmeter=0; //划线 functiondrawLine(beginx,beginy,endx,endy){ varc=document.getElementById("myCanvas"); varcxt=c.getContext("2d"); cxt.moveTo(beginx,beginy); cxt.lineTo(endx,endy); cxt.stroke(); } //模拟正态分布取值 functiongetNumberInNormalDistribution(mean,std_dev){ returnmean+(uniform2NormalDistribution()*std_dev); } //模拟正态分布偏差 functionuniform2NormalDistribution(){ varsum=0.0; for(vari=0;i<12;i++){ sum=sum+Math.random(); } returnsum-6; } //画一个长方形 functiondrawRect(x,y,width,index){ varcolor="#FF0000"; if(index==1){ color="#00FF00"; }elseif(index==2){ color="#0000FF"; } varc=document.getElementById("myCanvas2"); varcxt=c.getContext("2d"); cxt.fillStyle=color; cxt.fillRect(x*width+index*200,400-y,width-2,y); } //画出生成的图像 functiondrawResult(index){ varcolor="#FF0000"; if(index%3==1){ color="#00FF00"; }elseif(index%3==2){ color="#0000FF"; } varresult=generateList(); varresultStr=""; //for(variinresult){ //resultStr=resultStr+result[i]+"\n"; //} //document.getElementById("text").value=resultStr; varresulttimes={}; for(variinresult){ if(resulttimes[result[i]]==null){ resulttimes[result[i]]=1; }else{ resulttimes[result[i]]=resulttimes[result[i]]+1; } } for(variinresulttimes){ resultStr=resultStr+resulttimes[i]+"\n"; } document.getElementById("text").value=resultStr; vartimeslist=[]; vartimes=1; for(variinresult){ if(result[i]==index){ addPoint(times,i/5,color); if(timesArrObj[index]==null){ timesArrObj[index]=[]; } timesArrObj[index].push(times); times=0; }else{ times++; } } } //权重数组 varwt=[105,216,316,488,1000,2000,3680,5890];//,14770,71535 //生成结果数组函数,结果为权重数组的索引,从0开始 functiongenerateList(){ //生成的结果数组长度 varn=50000; varwtp=[]; varsum=0; for(variinwt){ sum=sum+wt[i]; } for(variinwt){ wtp.push(wt[i]/sum); } varresult=[]; varp=[]; for(variinwtp){ varinp=getNumberInNormalDistribution(1/wtp[i],1/wtp[i]/3); p.push(inp); } for(vari=0;i