鱼C论坛

 找回密码
 立即注册
查看: 1884|回复: 3

[技术交流] 小练习结果揭晓:骰子游戏

[复制链接]
发表于 2017-8-21 21:41:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原帖子:http://bbs.fishc.com/thread-94399-1-1.html
题目:

Peter 有九个四面的(金字塔型)骰子,每个分别标上 1,2,3,4。
Colin 有六个六面(正方体)骰子,每个分别标上 1,2,3,4,5,6。

Peter 和 Colin 摇骰子,然后比较他们得到的总和:总和最高的获胜。如果相等的话,则是平局。
请问,金字塔 Peter 赢了正方体 Colin 的概率是多少?以七位小数 0.abcdefg 的形式给出你的答案。

正确答案是:
0.5731441

回答正确的鱼油是:
jerryxjr1220  0.2519s
小Q学Python  0.4143s
夏天和大熊    0.3912s
运维小书童    1.5578s
小剑剑          0.0200s
suloman       1.0474s
Greenland    0.3101s
chunchun2017  0.0266s

用时最短的是:
小剑剑          0.0200s
chunchun2017  0.0266s

我把我的程序也发出来和大家交流一下。
  1. import itertools, time
  2. start = time.time()
  3. lst_p = itertools.product(range(1, 5), range(1, 5), range(1, 5), range(1, 5),
  4.     range(1, 5), range(1, 5), range(1, 5), range(1, 5), range(1, 5)) #把9个4面的骰子模拟出所有的可能
  5. p = (sum(i) for i in lst_p) #看看这些可能的数字之和是什么
  6. d_p=dict.fromkeys(range(9, 37), 0)#由于最小数是9最大数是36,建立一个字典存放每个和数的数量

  7. for i in p:
  8.     d_p[i] += 1

  9. lst_c = itertools.product(range(1, 7), range(1, 7), range(1, 7), range(1, 7),
  10.     range(1, 7), range(1, 7))
  11. c = (sum(i) for i in lst_c)
  12. d_c=dict.fromkeys(range(6, 37), 0)

  13. for i in c:
  14.     d_c[i] += 1
  15. win = 0
  16. total = 0
  17. lst = itertools.product(d_p, d_c) #再将Peter 和Colin相互比较的所有可能对比
  18. for i in lst:
  19.     if i[0] > i[1]:
  20.         win += d_p[i[0]] * d_c[i[1]]
  21.     total += d_p[i[0]] * d_c[i[1]]
  22. print('%.7f'%(win/total))
  23. print(time.time() - start)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-21 22:51:51 | 显示全部楼层
我觉得有问题,
按照jerryxjr1220的算法,Peter = dice_possibilities(3,2)即2个三面的骰子,结果是Counter({4: 3, 3: 2, 5: 2, 2: 1, 6: 1}),和为3的情况有2种,但是实际上骰子是不分序号的,假设左右各有一个骰子,左1右2和左2右1应该算同一种情况,和为3的情况只有1种情况才对
这道题应该是组合题,而不是排列题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-21 23:39:08 | 显示全部楼层
达锅 发表于 2017-8-21 22:51
我觉得有问题,
按照jerryxjr1220的算法,Peter = dice_possibilities(3,2)即2个三面的骰子,结果是Counte ...

我们讨论的是每种和的可能性,当第一是1,第二是2和第一是2,第二是1,这两种可能都是和为3,所以应该是2种。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 08:27:51 | 显示全部楼层
达锅 发表于 2017-8-21 22:51
我觉得有问题,
按照jerryxjr1220的算法,Peter = dice_possibilities(3,2)即2个三面的骰子,结果是Counte ...

求概率的时候要把所有可能的组合都算进去,所以(1,2)和(2,1)是2种可能的组合。
其实算概率的分母也是把重复的情况都考虑进去了,如果是2个三面骰子,分母就是3**2,你按照Counter的和来看3+2+2+1+1=9也是一致的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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