1、实现
转盘分多种情况,常见的有 单纯计算几率 和 限制数量
1.1、单纯结算几率的实现
1)计算出总概率的精度M
2)然后将所有的概率数组依次遍历
3)遍历中随机取出一个1~M的数字
4)如果随机数比当前这个数概率小,则表示命中。
5)反之则将总精度减去当前未命中的概率,表示剩余的总概率
总精度是为了生成随机数,而减去未命中的概率是为了排除出去,最后必定会命中
1.1.1、代码实现
/**
* 返回转盘抽奖结果
* @param array $proArr 概率数组
* @return int|string 返回对应数组的下标
*/
private function getRandPrize($proArr)
{
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {
$result = $key;
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
1.1.2、测试
1)我们可以看出已经很接近对应的概率了。
2)我这里是跑一万次,我分别跑了好几次观察结果是可行的。
网友评论