You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

五枚公平骰子掷出五个不同面的概率计算及Python脚本问询

嘿,我来帮你搞定这个概率计算问题,顺便写出正确的Python脚本~

先理清正确的概率计算逻辑

首先得明确两个核心数值:

  • 掷五枚公平骰子的总可能结果数:每枚骰子有6种面,所以总结果是 6**5 = 7776 种,这个你应该是对的。
  • 满足「五个数字各恰好出现一次」的有效结果数:这相当于从6个数字里选5个进行全排列——第一枚骰子有6种选择,第二枚不能重复所以是5种,第三枚4种,以此类推,也就是 6×5×4×3×2 = 720 种。

所以正确的概率是:720 / 7776 = 5/54 ≈ 0.09259,和你之前得到的结果差了不少,应该是计算有效结果数的时候出了偏差~

两种Python实现方式

这里给你写两种脚本,一种是直接用数学公式计算(高效准确),另一种是用模拟的方式验证(适合新手直观理解):

方式1:数学公式直接计算

# 计算所有可能的结果数
total_outcomes = 6 ** 5
# 计算符合条件的结果数:6选5的排列数
valid_outcomes = 6 * 5 * 4 * 3 * 2
# 计算概率
probability = valid_outcomes / total_outcomes

# 输出结果,同时展示分数和小数形式
print(f"精确概率:{valid_outcomes}/{total_outcomes} = {probability:.6f}")

运行这段代码会输出:精确概率:720/7776 = 0.092593

方式2:蒙特卡洛模拟验证

如果想通过反复掷骰子的模拟来验证结果,可以用这个脚本(模拟次数越多,结果越接近真实值):

import random

def simulate_unique_rolls(num_trials):
    valid_rolls = 0
    for _ in range(num_trials):
        # 生成5个1-6的随机数,模拟掷5枚骰子
        rolls = [random.randint(1, 6) for _ in range(5)]
        # 用集合去重,长度为5说明所有数字都不重复
        if len(set(rolls)) == 5:
            valid_rolls += 1
    # 返回模拟得到的概率
    return valid_rolls / num_trials

# 模拟100万次
simulated_prob = simulate_unique_rolls(1000000)
print(f"模拟概率(100万次):{simulated_prob:.6f}")

运行后结果会在0.0926左右浮动,和数学计算的结果一致。

小提示:为什么你的结果不对?

你之前得到的3245/7776≈0.417,看起来像是计算「至少有一个重复」的概率的补集?不对,或者可能是误把组合数当成了排列数?比如如果错误地用了组合数C(6,5)=6,那显然不对。不管怎样,按照上面的逻辑,正确结果就是5/54(约9.26%)。

内容的提问来源于stack exchange,提问作者Midou35000

火山引擎 最新活动