1 changed files with 150 additions and 0 deletions
@ -0,0 +1,150 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace app\logic; |
||||
|
use app\model\ZoneGoodsParam; |
||||
|
use app\model\ZoneOrder; |
||||
|
use think\facade\Db; |
||||
|
|
||||
|
/** |
||||
|
* 专区逻辑层 |
||||
|
*/ |
||||
|
class Zone |
||||
|
{ |
||||
|
|
||||
|
/** |
||||
|
* 余额扣减后 生成订单 |
||||
|
* @param $user_id |
||||
|
* @param $zone_goods_id |
||||
|
* @return array |
||||
|
* @throws \think\db\exception\DataNotFoundException |
||||
|
* @throws \think\db\exception\DbException |
||||
|
* @throws \think\db\exception\ModelNotFoundException |
||||
|
*/ |
||||
|
public static function createOrder($user_id,$zone_goods_id) |
||||
|
{ |
||||
|
# 获取奖项个参数 |
||||
|
$zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $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; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue