剑指offer 面试题60 python版+解析:n个骰子的点数

本文介绍了一种计算n个骰子投掷结果点数和的概率分布的方法。通过使用两个数组来记录每轮投掷的累积概率,实现了对所有可能结果的有效跟踪。这种方法能够高效地解决此类概率问题。

题目描述:

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。

思路:定义两个数组。数组的长度为6*n,即可能出现的最大和。数组每个元素的值代表出现的次数,比如probability[5]表示点数和为5出现的次数。在一轮循环中,一个数组记录之前一次所有出现的情况,一个数组记录这一次的所有出现的情况。例如这一次出现和为n的次数,应该等于另一个数组里记录的n-1,n-2, n-3, n-4, n-5, n-6的和。

class Solution:
    # @param {int} n an integer
    # @return {tuple[]} a list of tuple(sum, probability)
    def dicesSum(self, n):
        # Write your code here
        if  n<1:
            return []
        probability = []
        probability.append([0]*(6*n+1))
        probability.append([0]*(6*n+1))
        flag = 0
        ratio = []
        for i in range(1,7):
            probability[flag][i]=1 
        
        for k in range(2, n+1):
            for i in range(0, k):
                probability[1-flag][i]=0
            for i in range(k, 6*k+1):
                probability[1-flag][i] = 0
                for j in range(1, min(i+1,7)):
                    probability[1-flag][i] += probability[flag][i-j]
                   
            flag = 1-flag
            
        
        total = pow(6,n)
        for i in range(n, 6*n+1):
            ratio.append([i, probability[flag][i]/total])
        return ratio

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值