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数组操作