找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2232|回复: 3

[求助] 骰子问题

1

主题

2

帖子

2

积分

贫民

积分
2
wangfeijian 发表于 2018-1-13 16:06:13 | 显示全部楼层 |阅读模式
有n个m面骰子求抛出来后点数的概率,需要定义一个函数
def dict(a, b, x):
a表示骰子的个数,b表示骰子的面数,x表示抛出来得到的骰子点数
函数返回x出现的概率数
例如:
dict(2, 6, 3) 返回0.0556
dict(2, 6, 4) 返回0.0833
dict(2, 3, 7) 返回0.0000
dict(10, 10, 50) 返回0.0375
回复

使用道具 举报

1

主题

2

帖子

2

积分

贫民

积分
2
wangfeijian  楼主| 发表于 2018-1-13 16:08:16 | 显示全部楼层
有没有人啊,帮帮忙啊,在线等啊
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2018-1-15 11:25:22 | 显示全部楼层
wangfeijian 发表于 2018-1-13 16:08
有没有人啊,帮帮忙啊,在线等啊

递归最容易理解
  1. def dict(a, b, x):
  2.     if x < a or a * b < x:
  3.         return 0.0
  4.     k = 1.0 / b
  5.     return sum([dict(a - 1, b, x - 1 - i) * k for i in range(b)]) if a != 1 else k
复制代码
但是时间受不了啊,估计得用动归,但是你又没给a,b,x的范围
回复 支持 反对

使用道具 举报

1

主题

10

帖子

10

积分

贫民

积分
10
jackielu 发表于 2018-1-15 17:16:40 | 显示全部楼层
def dice_count(a, b, x):
    total = 0
    count = 0
    for pv in xrange(a, a*b+1):
        result = get_stitutions(a, b, pv)
        print 'a:', a, 'b:', b, 'count:', pv, 'result:', result
        total += len(result)
        if pv == x:
            count = len(result)
    print 'total:', total
    print 'count:', count
    print 'probability:', count*1.0/total

def get_stitutions(a, b, count):
    if count == a:
        return [[1] * a]
    lst = get_stitutions(a, b, count-1)
    result = []
    for stitution in lst:
        for i in xrange(len(stitution)):
            newstitu = copy.deepcopy(stitution)
            newstitu[i] += 1
            if newstitu[i] > b:
                continue
            if not containResult(result, newstitu):
                result.append(newstitu)
    return result

def containResult(result, stitution):
    for i in result:
        if not [s for s in stitution if s not in i]:
            return True
    return False

代码说明:
函数get_stitutions是为了获取a个b面骰子情况下 随机抛出count点数所有的情况
假如a=2, b=6, count=3 函数返回的结果为:[[2, 1]]
假如a=2, b=6, count=4 函数返回的结果为:[[3, 1], [2, 2]] 依次类推
函数containResult是为了防止结果中有重复的现象
例如:[[2, 1]] 和 [[1, 2]]是同一种结果 出现这种情况最主要原因是我采用递归来求取点数的情况的
也就是函数get_stitutions的功能
函数的核心是假如我想求取抛出点数为10的所有情况 那么我会将所有抛出点为9的情况遍历
将每种情况下的骰子点数+1 然后在筛选出符合情况的(骰子点数>b 包含相同数据的都不符合情况)

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表