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

Python开发宾果/Housie票生成器出现重复数字、超行容量bug求助

问题定位
  • 重复数字bug根源:你的数字生成函数递归逻辑错误。当第一次生成的数字已被移除时,触发异常后调用递归函数,递归执行完成返回当前层级后,当前层级仍会把一开始生成的重复数字追加到行列表中,同时多扣一次numOfNums计数。比如生成21已存在,递归生成25追加成功,返回后又追加21,就会出现[21,25,21]的重复情况。
  • 行长度超3bug根源:同样来自上述递归逻辑的副作用,一次生成函数调用可能会追加多个数字到行列表,哪怕调用前判断了行长度<3,调用后也可能直接超过长度上限。同时你后续补数字的循环以u<6作为终止条件,若多次随机到已经满额的行,会出现实际追加数字不足6个的问题。
修复方案
  1. 重构数字生成函数,去掉错误的递归逻辑,改用循环重试,确保每次调用只追加1个有效数字,只扣1次计数
  2. 合并9个冗余的行生成函数为通用函数,降低代码维护成本
  3. 后续补数字的循环改用剩余需生成数字数>0作为终止条件,保证凑齐15个有效数字
修改后的可运行代码
import random

def generate_housie_ticket():
    # 初始化每行的取值范围
    row_ranges = [
        (1,9), (10,19), (20,29), (30,39), (40,49),
        (50,59), (60,69), (70,79), (80,90)
    ]
    # 初始化9个空行、已使用数字集合
    rows = [[] for _ in range(9)]
    used_nums = set()
    total_needed = 15

    # 通用生成指定行有效数字的函数
    def gen_row_num(row_idx):
        min_val, max_val = row_ranges[row_idx]
        while True:
            num = random.randint(min_val, max_val)
            if num not in used_nums:
                used_nums.add(num)
                rows[row_idx].append(num)
                break

    # 先给每行加1个数字,共9个
    for i in range(9):
        gen_row_num(i)
    
    # 补剩下的6个数字
    remaining = total_needed - 9
    while remaining > 0:
        # 筛选还没满3个数字的行
        available_rows = [i for i in range(9) if len(rows[i]) < 3]
        selected_row = random.choice(available_rows)
        gen_row_num(selected_row)
        remaining -= 1
    
    # 每行内部排序,符合宾果票显示习惯
    for row in rows:
        row.sort()
    
    return rows

# 测试输出
ticket = generate_housie_ticket()
for idx, row in enumerate(ticket, 1):
    print(f"第{idx}行:{row}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:57:02