//奖品列表,weight为权重
$prizes = [
['Index' => 0, 'Weight' => 50],
['Index' => 1,'Weight' => 50],
['Index' => 2,'Weight' => 40],
['Index' => 3,'Weight' => 30],
['Index' => 4, 'Weight' => 15],
['Index' => 5, 'Weight' => 10],
['Index' => 6, 'Weight' => 5],
['Index' => 7, 'Weight' => 5],
['Index' => 8, 'Weight' => 3],
['Index' => 9, 'Weight' => 1],
];
//打乱奖品数组顺序
shuffle($prizes);
// 权重计算
$weightCount = 0;
foreach ($prizes as $prize) {
$weightCount += $prize['Weight'];
}
// 随机数抽奖,取5次平均值
$rand1 = mt_rand(1, $weightCount);
$rand2 = mt_rand(1, $weightCount);
$rand3 = mt_rand(1, $weightCount);
$rand4 = mt_rand(1, $weightCount);
$rand5 = mt_rand(1, $weightCount);
// 最终随机数
$rand = intval(($rand1 + $rand2 + $rand3 + $rand4 + $rand5) / 5);
$lastWeight = 0; //权重计算中间值
$userPrize = null; //奖品
foreach ($prizes as $prize) {
if ($rand > $lastWeight && $rand <= ($prize['Weight'] + $lastWeight)) {
$userPrize = $prize;
break;
} else {
$lastWeight += $prize['Weight'];
continue;
}
}
return $userPrize;
|