大概想法是这样的,
将 所有抽奖的可能结果 放在一个数组里,
然后用随机整数 rand函数,取出一个下表。
如果库存为0则不放在数据里,
如果库存大则概率大一些。具体实现:
//拿到所有奖品的总共可 抽奖数量,以及今天剩余 抽奖数量
$allPrize = $this->getPrizeService()->getAllPrize();
$lotteryArray = [];
foreach ($allPrize as $prize) {
//查看总共还剩多少个可以派发
$prizeTotalSurplus = $this->getTotalSurplus($prize['id']);
//查看今日还可以有多少个派发
$prizeTodaySurplus = $this->getTodaySurplus($prize['id']);
//如果今日可派发大于 总可派发,那么按照总派发数,如果总派发数为0 或者今日可派发数为0,continue,进行下一个奖项。
if ($prizeTotalSurplus == 0 or $prizeTodaySurplus == 0) continue;
if ($prizeTodaySurplus > $prizeTotalSurplus) $prizeTodaySurplus = $prizeTotalSurplus;
//如果按照库存量计算概率
// for ($i = 0; $i < $prizeTodaySurplus * $prize['rate']; $i++) {
//只看概率
for ($i = 0; $i < $prize['rate'] ; $i++) {
$lotteryArray[] = $prize['id'];
}
}
$lotteryCount = count($lotteryArray);
$lotteryRes = rand(0, $lotteryCount - 1);