Python骰子计算器掷骰次数异常:输入1000次仅输出约800次求助
问题排查与修复
核心问题1:掷骰范围错误导致统计次数不足
你定义的roll()函数里用了randint(1,7),但Python的randint(a,b)是闭区间,会生成包含a和b的整数,所以这里会随机生成1-7的数字。而后续统计时只计算1-6的出现次数,那些生成7的情况被排除了,总统计次数自然会比设置的n少(比如n=1000时,大约有1/7的概率生成7,总统计次数约857左右,和你描述的800次接近)。核心问题2:总次数变量未更新
rolledtimes初始设为0后从未修改,所以打印的"Rolled {} times"永远显示0,这也是你觉得总次数不符的原因之一。冗余问题:重复掷骰与无用导入
代码里做了两次独立的掷骰操作:一次是更新ROLLED字典的循环,一次是生成rolled列表的推导式,两者数据完全独立,导致最后打印的次数和概率统计结果不一致。同时导入了ast.operator、itertools.count、os.sep这些完全没用到的模块,应该删除。
修正后的代码
import random def roll(): # 修正掷骰范围,生成1-6的整数 return random.randint(1, 6) n = int(input("How many rolls?")) # 初始化统计字典 rolled_counts = {i: 0 for i in range(1, 7)} # 单次循环完成掷骰与统计 for _ in range(n): result = roll() rolled_counts[result] += 1 # 打印结果 print(f'Rolled {n} times:\n') for num in range(1, 7): print(f'{num} is rolled {rolled_counts[num]} times') # 计算并打印频率 print("\nFrequency") for num, count in rolled_counts.items(): print(f"\t{num}: {count * 100 / n:.2f}%")
关键修正说明
- 把
roll()函数里的randint(1,7)改成randint(1,6),确保只生成1-6的骰子点数。 - 删除所有无用导入,只保留需要的
random模块。 - 用单次循环完成掷骰和统计,避免重复操作,保证数据一致性。
- 直接用输入的
n作为总掷骰次数显示,也可以通过sum(rolled_counts.values())计算验证,结果均为n。 - 用f-string简化打印逻辑,提升代码可读性。
内容的提问来源于stack exchange,提问作者Mathias
相关产品推荐
相关产品推荐

