Python 需要输出滚动2个骰子的前3个结果,这两个骰子的边数可变

Python 需要输出滚动2个骰子的前3个结果,这两个骰子的边数可变,python,sum,dice,Python,Sum,Dice,下面的代码计算两个骰子在不同数量的等边上滚动的结果的概率分布: 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[

下面的代码计算两个骰子在不同数量的等边上滚动的结果的概率分布:

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

例如,对于普通的六面骰子,prob dist是[(2,6)、(3,2)、(4,3)、(5,4)、(6,5)、(7,6)、(8,5),)(9,4)、(10,3)、(11,2)、(12,1)],其中每个元组的第一个元素是两个骰子的总和,第二个元素是它在一个骰子上出现的方式数。有谁能告诉我如何按每个元组的第二个元素对上面的prob dist列表进行排序,这样我就可以输出最有可能出现的情况(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)]
from collections import Counter

def compute_probability_distribution(sides):
  dist = Counter(die_1 + die_2 for die_1 in range(1, sides+1)
                               for die_2 in range(1, sides+1))
  probs = dist.most_common(3)
  print "Prob dist: ", probs
所以我们得到了六倍于七的总和;五乘以六之和;五乘以八的和

如果您想使骰子的数量任意,可以使用:

from collections import Counter
from itertools import product

def compute_probability_distribution(sides,ndices=2,common=3):
  dist = Counter(sum(d) for d in product(range(1,sides+1),repeat=ndices))
  probs = dist.most_common(common)
  print "Prob dist: ", probs

你可以用嵌套的理解来计算,但是如果你知道边的数目,你也可以手工计算最常见的值

按照概率增加的顺序:

  • 2
    边+边
    只有一个“机会”
  • 然后是
    3
    侧面+nsides-1
    ,它们有2个
  • 4
    侧面+nsides-2
    有3个
  • 最后,
    sides+1
    的概率最高,就是
    sides
如果你不相信我,看看不同边数的概率分布

因此,要获得3个最常见的值,您只需根据边数计算它们:

def compute_probability_distribution(sides):
    print([(sides+1, sides), (sides, sides-1), (sides+2, sides-1)])

然而,这只适用于至少有两个边的骰子。对于单面骰子,使用此功能的结果会很奇怪。

您的右侧;概率由Pascal三角形构成,中间有顶点。我看到了,但没有想到使用它,因为我想看看排序(或排序)是如何工作的。不过,这是一个绝妙的解决方案。您使用计数器的解决方案很有趣,但它忽略了2和6是等概率的这一事实。@CElliott:请注意,我们这里使用的是三个骰子,而不是两个。如何用三个5-骰子生成2?在问题的原始stmt中,probs被给出为[(2,6),(3,2),(4,3),…]。(2,6)是一个打字错误;我的错,对不起。因此,您对六面模具的回答是正确的。世界毕竟是有道理的。
>>> 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)]
def compute_probability_distribution(sides):
    print([(sides+1, sides), (sides, sides-1), (sides+2, sides-1)])