PHP和JavaScript中奖概率算法
这是一个经典的概率算法。
现在有数组:[10,20,30,40]。
假设对应中奖几率:特等奖10%,一等奖20%,二等奖30%,三等奖40%,总共100%。
算法开始时,从数组中选出一个值$value,再从1-100概率空间内随机选出一个数$rand。
比较$value和$rand,如果$rand在$value概率范围之内,则直接返回$value对应的key。
如果不在,则将概率空间的值减去$value值。
在本例中,第一次判断之后,就是减去10,也就是说第二次是在1-90这个范围内筛选的。
这样筛选到最后,总会有一个数满足要求。
就相当于去一个箱子里摸东西,
第一个不是,第二个不是,第三个还不是,那最后一个一定是。
这个算法简单,而且效率非常高。
1PHP实现
<?php functiongetRand($arr) { $result=''; //概率数组的总概率精度 $sum=array_sum($arr); //概率数组循环 foreach($arras$key=>$value){ $rand=mt_rand(1,$sum); if($rand<=$value){ $result=$key; break; }else{ $sum-=$value; } } unset($arr); return$result; }
使用范例:
$a=[10,20,30,40]; //输出3的概率最大 echo'PHP:'.getRand($a);
2Javascript实现
<script> functiongetRand(arr){ varresult=0; varsum=arr.reduce(function(a,b){ returna+b; }); for(indexinarr){ rand=Math.round(Math.random()*(sum-1)+1); if(rand<=arr[index]){ returnindex; }else{ sum-=arr[index]; } } returnresult; } //使用示例,输出2的概率最大 vara=[10,20,30,40]; document.write('<br/>Javascript:'+getRand(a)); </script>
使用范例:
//使用示例,输出3的概率最大 vara=[10,20,30,40]; document.write('<br/>Javascript:'+getRand(a));
参考资料:
- PHP中奖概率算法
- Javascript数组操作