简化Monte Carlo模拟多颗10面骰子求和及直方图绘制的Python代码
简洁的多颗10面骰子蒙特卡洛模拟实现
核心优化思路
用向量式运算替代逐次循环,把模拟次数、骰子数量、骰子面数设为可配置变量,不管骰子数量增加到多少,代码结构完全不变,彻底解决冗余问题。
完整实现代码
import numpy as np import matplotlib.pyplot as plt # 可配置参数,修改这里即可调整模拟规则 num_simulations = 10000 num_dice = 2 # 改成3、4等任意数量都无需修改其他代码 dice_sides = 10 # 生成所有投掷结果:每行对应一次投掷的所有骰子点数 rolls = np.random.randint(1, dice_sides + 1, size=(num_simulations, num_dice)) # 计算每次投掷的点数和 sums = rolls.sum(axis=1) # 统计各点数和的出现次数 counts, bin_edges = np.histogram(sums, bins=np.arange(num_dice, num_dice * dice_sides + 2)) sum_values = bin_edges[:-1] # 提取所有可能的点数和取值 # 绘制直方图 plt.bar(sum_values, counts, width=0.8) plt.xlabel('骰子点数和') plt.ylabel('出现次数') plt.title(f'{num_simulations}次投掷{num_dice}颗{dice_sides}面骰子的点数和分布') plt.xticks(sum_values) plt.show()
代码优势说明
- 无冗余硬编码:所有和骰子数量相关的逻辑都由numpy自动处理,新增骰子只需修改
num_dice变量 - 效率更高:numpy的数组运算比Python循环快几个数量级,模拟次数越多优势越明显
- 扩展性强:可以轻松调整模拟次数、骰子面数,甚至适配非标准骰子的点数范围
内容的提问来源于stack exchange,提问作者user21637077
相关产品推荐
相关产品推荐

