需要输出滚动2个骰子的前3个结果,这些结果具有可变数量的边

时间:2017-08-06 18:46:02

标签: python sum dice

以下代码计算滚动两个骰子的结果的概率分布,这两个骰子具有可变数量的相等边:

int sys_putc(char c) {
    int ret;
    asm volatile("int $0x80" : "=a"(ret) : "0"(SYS_write), "b"(1), "c"(&c), "d"(1));
    return ret;
}

例如,对于普通的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)?我正在考虑使用内置列表排序和某种比较功能。

3 个答案:

答案 0 :(得分:2)

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)]

答案 1 :(得分:2)

您可以使用嵌套的理解来完成它,但如果您知道边数,也可以手动计算最常用的值。

为了增加概率:

  • echo '<p>' . next($cell) . '</p>';` 2只有一次“机会”。
  • 然后sides+sides3有2个。
  • sides+nsides-14有3
  • ...
  • 最后sides+nsides-2概率最高,仅为sides+1

如果你不相信我,请查看不同数量边的概率分布。

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

sides

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

答案 2 :(得分:1)

我只想使用为此设计的数据结构:Counter

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

对于两个6-dices,这将产生:

>>> 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(sum(d) for d in product(range(1,sides+1),repeat=ndices))
  probs = dist.most_common(common)
  print "Prob dist: ", probs

所以现在我们可以计算出当我们滚动三个5-dices时最常见的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)]