如何优化该彩票模拟程序?
如何优化该彩票模拟程序?
我明白你现在的困境——明明电脑配置不差,但程序就是跑不完一次模拟。咱们来一步步找出问题根源,然后优化程序,让它既能符合真实彩票规则,又能高效运行。
先说说你当前代码的核心问题
- 号码重复不符合真实规则:真实彩票的6个号码是1-49范围内不重复的,但你用
randint生成的号码可能出现重复(比如Anums里可能有两个5)。这会导致两个大问题:一是匹配逻辑完全失真,二是“全中”的概率变得极端低下,甚至可能让程序几乎永远跑不完。 - 低效且错误的匹配统计:你用双重循环统计匹配次数,不仅速度慢,还会因为重复号码统计出错误的hits数(比如
Anums有两个5,Bnums有一个5,代码会算2次匹配,但实际应该是1次)。 - 不必要的控制台拖慢速度:每次循环都打印
Bnums,控制台输出的速度远慢于代码计算,这是拖慢程序的重要原因。
优化后的完整代码
from random import sample # 生成初始的6个不重复目标号码 Anums = sample(range(1, 50), 6) print(f"目标号码: {Anums}") tries = 0 three_matches = 0 four_matches = 0 five_matches = 0 while True: # 生成新的一组不重复号码 Bnums = sample(range(1, 50), 6) tries += 1 # 用集合交集快速统计匹配数量,高效又准确 common_numbers = set(Anums) & set(Bnums) hits = len(common_numbers) # 统计不同匹配次数的情况 if hits == 3: three_matches += 1 elif hits == 4: four_matches += 1 elif hits == 5: five_matches += 1 elif hits == 6: break # 输出最终统计结果 print(f"总共尝试了 {tries} 次") print(f"匹配3个号码的次数: {three_matches}") print(f"匹配4个号码的次数: {four_matches}") print(f"匹配5个号码的次数: {five_matches}") print(f"最终命中的号码: {Bnums}")
关键优化点说明
- 用
sample生成不重复号码:random.sample(range(1,50),6)会直接从1-49里随机选出6个不重复的数字,完美符合真实彩票规则,也避免了重复号码带来的匹配逻辑错误。 - 集合操作统计匹配数:把两组号码转成集合后,用交集操作
&就能快速得到共同元素,再取长度就是真实的匹配数量,比双重循环效率高得多,结果也绝对准确。 - 去掉冗余输出:只在开头打印目标号码,结尾打印统计结果,避免了每次循环都输出的性能损耗。
为什么现在能正常运行?
真实彩票中,全中6个号码的概率大约是1/13983816,所以程序确实需要运行几十万到上百万次循环,但你的电脑完全能处理这个量级的计算——之前的问题主要是重复号码导致概率异常,加上控制台输出拖慢了速度,优化后就能正常完成模拟了。
备注:内容来源于stack exchange,提问作者SomeOrdinaryCoder
相关产品推荐
相关产品推荐

