经典的几率算法。php
如今有数组:[10, 20, 30, 40] 。算法
假设对应中奖概率:特等奖10%,一等奖20%,二等奖30%,三等奖40%,总共100%。数组
算法开始时,从数组中选出一个值$value,再从1-100几率空间内随机选出一个数$rand。dom
比较$value和$rand,若是$rand在$value几率范围以内,则直接返回$value对应的key。code
若是不在,则将几率空间的值减去$value值。ip
在本例中,第一次判断以后,就是减去10,也就是说第二次是在1-90这个范围内筛选的。get
这样筛选到最后,总会有一个数知足要求。it
就至关于去一个箱子里摸东西,io
第一个不是,第二个不是,第三个还不是,那最后一个必定是。function
这个算法简单,并且效率很是高。
PHP实现
<?php function getRand($arr) { $result = ''; //几率数组的总几率精度 $sum = array_sum($arr); //几率数组循环 foreach ($arr as $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);
Javascript实现
<script> function getRand(arr) { var result = 0; var sum = arr.reduce(function(a, b) { return a + b; }); for (index in arr) { rand = Math.round(Math.random() * (sum - 1) + 1); if (rand <= arr[index]) { return index; } else { sum -= arr[index]; } } return result; } // 使用示例,输出2的几率最大 var a = [10, 20, 30, 40]; document.write('<br />Javascript:' + getRand(a)); </script> 使用范例: // 使用示例,输出3的几率最大 var a = [10, 20, 30, 40]; document.write('<br />Javascript:' + getRand(a));