【发布时间】:2012-03-10 01:39:55
【问题描述】:
我正在尝试学习 Python 库 itertools,我认为一个很好的测试是模拟掷骰子。使用product 很容易生成所有可能的滚动,并使用collections 库计算可能的方式数量。我正在尝试解决像Monopoly 这样的游戏中出现的问题:当双打时,你再次滚动,你的最终总数是两次滚动的总和。
以下是我解决问题的开始尝试:两个计数器,一个用于双打,另一个用于非双打。我不确定是否有将它们组合在一起的好方法,或者这两个计数器是否是最好的方法。
我正在寻找一种巧妙的方法来解决(通过枚举)使用 itertools 和集合的双打掷骰子问题。
import numpy as np
from collections import Counter
from itertools import *
die_n = 2
max_num = 6
die = np.arange(1,max_num+1)
C0,C1 = Counter(), Counter()
for roll in product(die,repeat=die_n):
if len(set(roll)) > 1: C0[sum(roll)] += 1
else: C1[sum(roll)] += 1
【问题讨论】:
-
您能否更正式地说明一下这个问题?
-
@KarlKnechtel 使用库 itertools 和 collections 枚举从
1到m顺序编号的n骰子时出现的非标准化概率分布。要计数的函数是n骰子的总和,除非所有骰子都匹配。如果所有骰子都在第一次掷骰上匹配,则计数的数字是第一次掷骰和第二次掷骰的总和。他们是否在第二卷上匹配并不重要。带有两个骰子的样本卷,编号为 1..6:[3,4], [2,1], [[4,4], [6,2]],总数为[7,3,16]。 -
你可以考虑在蒙特卡洛风格的模拟中解决这个问题。如果您在树表示中考虑这个问题:从根开始,向深度 = 1 的孩子滚动一次,其中只有具有双精度的孩子具有相同结构的更深孩子的子树。这意味着那些双滚子指向根。现在你有了一个很好的结构,并且可以从根开始进行随机渲染来估计事件的概率。
标签: python algorithm itertools python-collections