php 抽奖概率算法
/*
* 不同概率的抽奖原理就是把0到*(比重总数)的区间分块
* 分块的依据是物品占整个的比重,再根据随机数种子来产生0-* 中的某个数
* 判断这个数是落在哪个区间上,区间对应的就是抽到的那个物品。
* 随机数理论上是概率均等的,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。
*/
function get_rand($proArr)
{
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
$proSum = array_sum($arr); // 计算总权重
$randNum = mt_rand(1, $proSum);
$d1 = 0;
$d2 = 0;
for ($i=0; $i < count($arr); $i++)
{
$d2 += $arr[$i];
if($i==0)
{
$d1 = 0;
}
else
{
$d1 += $arr[$i-1];
}
if($randNum >= $d1 && $randNum <= $d2)
{
$result = $proArr[$i];
break; // 注意这里,当我们已经匹配到奖品时,就应该直接退出循环
}
}
unset ($arr);
return $result;
}