You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化PHP抽奖系统:为1万张门票分配额外中奖机会

抽奖系统号码分配优化方案

核心优化思路

放弃预生成所有未售号码再循环/随机分配的冗余方式,通过规则直接计算每个门票对应的额外号码,既避免大数组占用内存,又能严格符合分配规则,执行效率拉满。

需求规则拆解

结合你的要求,把50000个未售号码按规则拆成5组,每组刚好对应10000张票的一个额外名额:

  • 第1组:从20000递减至10001(共10000个)
  • 第2组:从20001递增至30000(共10000个)
  • 第3-5组按同逻辑扩展:分别对应30001-40000、40001-50000、50001-60000,刚好凑齐50000个未售号码,且完全避开已售的10000个号码(若已售号码不是1-10000,只需调整分组的起始/终止值即可)

PHP 实现代码

<?php
// 基础配置
$totalTickets = 10000;
$extraCountPerTicket = 5;

// 定义每组号码的生成规则:[起始值, 步长]
$groupRules = [
    [20000, -1],   // 第1组:从20000开始,每次减1,到10001结束
    [20001, 1],    // 第2组:从20001开始,每次加1,到30000结束
    [30001, 1],    // 第3组:30001→40000
    [40001, 1],    // 第4组:40001→50000
    [50001, 1]     // 第5组:50001→60000
];

// 为每张票生成对应额外号码
$ticketExtraNumbers = [];
for ($ticketId = 1; $ticketId <= $totalTickets; $ticketId++) {
    $extraNumbers = [];
    foreach ($groupRules as $rule) {
        list($start, $step) = $rule;
        // 直接计算当前票在该组的号码
        $number = $start + $step * ($ticketId - 1);
        $extraNumbers[] = $number;
    }
    $ticketExtraNumbers[$ticketId] = $extraNumbers;
}

// 示例输出:第1张和第10000张票的额外号码
print_r($ticketExtraNumbers[1]);    // 输出:[20000, 20001, 30001, 40001, 50001]
print_r($ticketExtraNumbers[10000]);// 输出:[10001, 30000, 40000, 50000, 60000]
?>

适配已售号码非连续的场景

如果已售的10000个号码是随机分散的,可按以下方式调整:

<?php
$totalNumbers = 60000;
$soldNumbers = [/* 已售的10000个号码数组 */];
$totalTickets = 10000;
$extraCountPerTicket = 5;

// 生成所有可用号码并排除已售
$availableNumbers = array_diff(range(1, $totalNumbers), $soldNumbers);

// 按规则分组
rsort($availableNumbers);
$group1 = array_slice($availableNumbers, 0, 10000); // 第1组:从大到小取前10000个
$remaining = array_slice($availableNumbers, 10000);
sort($remaining);
$group2 = array_slice($remaining, 0, 10000);
$group3 = array_slice($remaining, 10000, 10000);
$group4 = array_slice($remaining, 20000, 10000);
$group5 = array_slice($remaining, 30000, 10000);

// 分配给每张票
$ticketExtraNumbers = [];
for ($ticketId = 0; $ticketId < $totalTickets; $ticketId++) {
    $ticketExtraNumbers[$ticketId + 1] = [
        $group1[$ticketId],
        $group2[$ticketId],
        $group3[$ticketId],
        $group4[$ticketId],
        $group5[$ticketId]
    ];
}
?>

优化点说明

  1. 内存占用大幅降低:直接计算的方式无需预存50000个号码,内存占用从O(50000)降至O(1)
  2. 规则执行严格:完全贴合你要求的递增/递减分配逻辑,不会出现号码违规重复
  3. 扩展性强:后续调整分组规则只需修改$groupRules或分组排序逻辑即可

内容的提问来源于stack exchange,提问作者krathos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:20:38