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

