需要输出掷 2 个骰子的前 3 个结果,这两个骰子的面数是可变的
Need to output the top 3 outcomes of rolling 2 dice, which have a variable number of sides
以下代码计算掷两个相等边数可变的骰子结果的概率分布:
def compute_probability_distribution(sides):
dist = {x+y: 0 for x in range(1, sides+1) for y in range(1, sides+1)}
for die_1 in range(1, sides+1):
for die_2 in range(1, sides+1):
dist[die_1+die_2] = dist[die_1+die_2] + 1
probs = dist.items()
print "Prob dist: ", probs
例如,对于普通的 6 面骰子,概率分布为 [(2,6),(3,2),(4,3),(5,4),(6,5),(7 ,6),(8,5),)(9,4),(10,3),(11,2),(12,1)],其中每个元组的第一个元素是 2 个骰子的总和,第二个元素是它在一卷中出现的方式的数量。谁能告诉我如何按每个元组的第二个元素对上述概率分布列表进行排序,以便我可以输出最有可能出现的前(1 或 3)次?我正在考虑使用带有某种比较功能的内置列表排序。
probs = [(2,6),(3,2),(4,3),(5,4),(6,5),(7,6),(8,5),(9,4),(10,3),(11,2),(12,1)]
>>> sorted(probs, key=lambda x: x[1]) # x[1] is second element of tuple pair.
[(12, 1),
(3, 2),
(11, 2),
(4, 3),
(10, 3),
(5, 4),
(9, 4),
(6, 5),
(8, 5),
(2, 6),
(7, 6)]
我会简单地使用为此设计的数据结构:a Counter
:
<b>from collections import Counter</b>
def compute_probability_distribution(sides):
dist = <b>Counter(die_1 + die_2 for die_1 in range(1, sides+1)
for die_2 in range(1, sides+1))</b>
probs = dist<b>.most_common(3)</b>
print "Prob dist: ", probs
对于两个 6 骰子,这将产生:
>>> compute_probability_distribution(6)
Prob dist: [(7, 6), (6, 5), (8, 5)]
所以我们得到六乘以七的和;五乘以六;和五乘以八。
如果你想让骰子的个数任意,你可以使用:
from collections import Counter
from itertools import product
def compute_probability_distribution(sides,ndices=2,common=3):
dist = Counter(<b>sum(d) for d in product(range(1,sides+1),repeat=ndices)</b>)
probs = dist.most_common(<b>common</b>)
print "Prob dist: ", probs
现在我们可以计算掷三个 5 骰子时最常见的 10 个和:
>>> compute_probability_distribution(5,3,10)
Prob dist: [(9, 19), (8, 18), (10, 18), (7, 15), (11, 15), (6, 10), (12, 10), (5, 6), (13, 6), (4, 3)]
您可以使用嵌套理解来完成,但如果您知道边数,也可以手动计算最常见的值。
按概率递增顺序排列:
2
和sides+sides
只有一个"chance"。
- 然后
3
和sides+nsides-1
其中有2个。
4
和 sides+nsides-2
有 3 个
- ...
- 最后
sides+1
的概率最高,正好是sides
。
如果您不相信我,请查看不同边数的概率分布。
所以要得到最常见的3个值,你可以简单地根据边数计算它们:
def compute_probability_distribution(sides):
print([(sides+1, sides), (sides, sides-1), (sides+2, sides-1)])
但是,这仅适用于至少有 2 个面的骰子。对于单面骰子,这个函数的结果会很奇怪。
以下代码计算掷两个相等边数可变的骰子结果的概率分布:
def compute_probability_distribution(sides):
dist = {x+y: 0 for x in range(1, sides+1) for y in range(1, sides+1)}
for die_1 in range(1, sides+1):
for die_2 in range(1, sides+1):
dist[die_1+die_2] = dist[die_1+die_2] + 1
probs = dist.items()
print "Prob dist: ", probs
例如,对于普通的 6 面骰子,概率分布为 [(2,6),(3,2),(4,3),(5,4),(6,5),(7 ,6),(8,5),)(9,4),(10,3),(11,2),(12,1)],其中每个元组的第一个元素是 2 个骰子的总和,第二个元素是它在一卷中出现的方式的数量。谁能告诉我如何按每个元组的第二个元素对上述概率分布列表进行排序,以便我可以输出最有可能出现的前(1 或 3)次?我正在考虑使用带有某种比较功能的内置列表排序。
probs = [(2,6),(3,2),(4,3),(5,4),(6,5),(7,6),(8,5),(9,4),(10,3),(11,2),(12,1)]
>>> sorted(probs, key=lambda x: x[1]) # x[1] is second element of tuple pair.
[(12, 1),
(3, 2),
(11, 2),
(4, 3),
(10, 3),
(5, 4),
(9, 4),
(6, 5),
(8, 5),
(2, 6),
(7, 6)]
我会简单地使用为此设计的数据结构:a Counter
:
<b>from collections import Counter</b>
def compute_probability_distribution(sides):
dist = <b>Counter(die_1 + die_2 for die_1 in range(1, sides+1)
for die_2 in range(1, sides+1))</b>
probs = dist<b>.most_common(3)</b>
print "Prob dist: ", probs
对于两个 6 骰子,这将产生:
>>> compute_probability_distribution(6)
Prob dist: [(7, 6), (6, 5), (8, 5)]
所以我们得到六乘以七的和;五乘以六;和五乘以八。
如果你想让骰子的个数任意,你可以使用:
from collections import Counter
from itertools import product
def compute_probability_distribution(sides,ndices=2,common=3):
dist = Counter(<b>sum(d) for d in product(range(1,sides+1),repeat=ndices)</b>)
probs = dist.most_common(<b>common</b>)
print "Prob dist: ", probs
现在我们可以计算掷三个 5 骰子时最常见的 10 个和:
>>> compute_probability_distribution(5,3,10)
Prob dist: [(9, 19), (8, 18), (10, 18), (7, 15), (11, 15), (6, 10), (12, 10), (5, 6), (13, 6), (4, 3)]
您可以使用嵌套理解来完成,但如果您知道边数,也可以手动计算最常见的值。
按概率递增顺序排列:
2
和sides+sides
只有一个"chance"。- 然后
3
和sides+nsides-1
其中有2个。 4
和sides+nsides-2
有 3 个- ...
- 最后
sides+1
的概率最高,正好是sides
。
如果您不相信我,请查看不同边数的概率分布。
所以要得到最常见的3个值,你可以简单地根据边数计算它们:
def compute_probability_distribution(sides):
print([(sides+1, sides), (sides, sides-1), (sides+2, sides-1)])
但是,这仅适用于至少有 2 个面的骰子。对于单面骰子,这个函数的结果会很奇怪。