$zone_goods_id]); $data = self::getWinningPrize2($zoneParamArr); # 记录订单 $zone_order_id = ZoneOrder::saveOrder($user_id,$zone_goods_id,$data); return [ 'data' => $data, 'zone_order_id' => $zone_order_id ]; } /** * 权重算法 * @param $patterns * @return array */ protected static function getWinningPrize($patterns) { $temp = [ ['image' => 'test.png', 'weight' => 1], // 奖项图案,权重为5 ['image' => 'prize2.png', 'weight' => 1], // 奖项图案,权重为3 ['image' => 'no_prize1.png', 'weight' => 1], // 非奖项图案,权重为10 ['image' => 'no_prize2.png', 'weight' => 1], // 非奖项图案,权重为8 ['image' => 'no_prize6.png', 'weight' => 1], // 非奖项图案,权重为8 ['image' => 'no_prize7.png', 'weight' => 1], // 非奖项图案,权重为8 ['image' => 'testtest.png', 'weight' => 0.01], // 非奖项图案,权重为8 ]; $patterns = array_merge($patterns,$temp); // 所有图案的权重相加 $totalWeight = 0; foreach ($patterns as $pattern) { $totalWeight += $pattern['weight']; } $imageArr = []; $numberOfGroups = 3; // 要生成的图案组数 $groupsNum = 4; // 要生成的图案组数 for ($i = 0; $i < $numberOfGroups; $i++) { // 每组生成 3 个图案 for ($j = 0; $j < $groupsNum; $j++) { // 输出选中图案 $selectedPattern = null; // 生成随机数 $randomNumber = rand(1, $totalWeight); foreach ($patterns as $pattern) { $randomNumber -= $pattern['weight']; if ($randomNumber <= 0) { $selectedPattern = $pattern; break; } } $imageArr[$i][] = $selectedPattern['image']; } } return $imageArr; } /** * 概率算法 * @return array */ protected static function getWinningPrize2($patterns) { // $patterns = [ // ['image' => 'prize1.png', 'probability' => 0.3], // 奖项图案,概率为30% // ['image' => 'prize2.png', 'probability' => 0.2], // 奖项图案,概率为20% // ['image' => 'no_prize1.png', 'probability' => 0.1], // 非奖项图案,概率为10% // ['image' => 'no_prize2.png', 'probability' => 0.32], // 非奖项图案,概率为32% // ['image' => 'test1.png', 'probability' => 0.07], // 非奖项图案,概率为7% // ['image' => 'test2.png', 'probability' => 0.002], // 非奖项图案,概率为0.2% // ['image' => 'test3.png', 'probability' => 0.003], // 非奖项图案,概率为0.3% // ['image' => 'test4.png', 'probability' => 0.004], // 非奖项图案,概率为0.4% // ['image' => 'test5.png', 'probability' => 0.001], // 非奖项图案,概率为0.1% // ]; // 计算概率总和 $totalProbability = 0; foreach ($patterns as $pattern) { $totalProbability += $pattern['probability']; } // 归一化处理,并计算累积概率 $accumulatedProbability = 0; foreach ($patterns as &$pattern) { $pattern['probability'] /= $totalProbability; // 归一化处理 $accumulatedProbability += $pattern['probability']; $pattern['accumulatedProbability'] = $accumulatedProbability; // 累积概率 } unset($pattern); $numberOfGroups = 3; // 要生成的图案组数 $groupNum = 4; // 要生成的图案组数 $data = []; for ($i = 0; $i < $numberOfGroups; $i++) { for ($j = 0; $j < $groupNum; $j++) { // 每组生成 3 个图案 $selectedPattern = null; $randomNumber = mt_rand() / mt_getrandmax(); // 生成 0 到 1 之间的随机数 foreach ($patterns as $pattern) { if ($randomNumber <= $pattern['accumulatedProbability']) { $selectedPattern = $pattern; break; } } $data[$i][] = $selectedPattern['image']; } } return $data; } }