彩票模拟器问题咨询:为何运行超1.5小时未终止及如何匹配无序号码
问题确认与修复方案
你的怀疑完全正确——当前程序确实只有当生成的号码顺序和中奖号码完全一致时才会判定中奖。列表的相等性判断是逐元素按顺序比对的,比如[6,26,...]和[49,33,...]虽然元素相同但顺序不同,程序会判定为不相等,循环会继续运行。这种情况的中奖概率极低,这就是程序跑了1.5小时还没结束的原因。
另外你的代码还有个不符合真实彩票规则的问题:用random.randint()可能生成重复号码,但实际彩票的6个号码是不重复的,这也会进一步降低“中奖”的实际概率。
修复代码
下面是符合真实彩票规则的修复版本,核心做了两个改进:
- 生成不重复的6个1-49之间的号码
- 比对时忽略顺序,只判断元素是否完全一致
方案1:用集合比对(推荐)
集合不关心元素顺序,只判断元素是否存在,比对效率高:
import random winning_numbers = {6, 26, 31, 32, 33, 49} counter = 0 while True: # 生成6个不重复的1-49随机数,转成集合 lotteryset = set(random.sample(range(1, 50), 6)) counter += 1 if lotteryset == winning_numbers: break print(f"Finished! I got {counter} tries to win.")
方案2:排序后比对
如果需要保留列表形式,可以对两个列表排序后再比对:
import random winning_numbers = [6, 26, 31, 32, 33, 49] # 先对中奖号码排序,避免每次循环重复排序 sorted_winning = sorted(winning_numbers) counter = 0 while True: # 生成6个不重复的随机数并排序 lotterylist = sorted(random.sample(range(1, 50), 6)) counter += 1 if lotterylist == sorted_winning: break print(f"Finished! I got {counter} tries to win.")
额外说明
- 原代码中初始生成的
lotterylist没有被计入counter,修复后的代码把每次生成都计数,统计更准确。 random.sample(range(1,50),6)会直接生成6个不重复的随机数,完美符合真实彩票的号码规则,比用randint加去重更高效。
内容的提问来源于stack exchange,提问作者ajodho
相关产品推荐
相关产品推荐

