1概率算法
//抽奖
public function action($params, &$msg = '')
{
$rate_list = $this->findWhere([]);
$max = 0;
foreach ($rate_list as $rate) {
$max += $rate['rate'];
}
foreach ($rate_list as $rate) {
$random = sprintf("%.6f", mt_rand() / mt_getrandmax() * ($max));
if ($random < $rate['rate']) {
return $rate;
} else {
$max -= $rate['rate'];
}
}
}
以上代码的理解
比如概率为0.5,0.3,0.2概率和为1也就是百分之百
第一次生成小于1的随机数
如果数字大于0.5则本次0.5的没中奖,删除0.5的奖品进入下次循环
此时总概率是0.5,也是百分之百,生成小于0.5的数
如果数字小于0.3 则本次中奖,如果生成的数字大于0.3则又没中删除0.3
此时只能中0.2
2数组抽奖
概率还是如上设置,方案大概是将概率生成对应的数组数量,直接生成随机数取数组的值,即可取出奖品,不过如果概率太小了,就要生成很大的数组