独特的骰子组合

Unique combinations of dice

我正在尝试为 Yahtzee(一种骰子游戏)建模。

作为第一步,我尝试枚举同时掷出的 5 个骰子的所有可能组合。我只想要独特的组合(例如 5,5,5,4,45,5,4,5,4 等同)。在 Python、C++ 或 Mathematica 中是否有一种简单的方法可以做到这一点?

您可以在 Python 中使用 itertools.combinations_with_replacement():

from itertools import combinations_with_replacement
options = list(range(1, 7))
print(list(combinations_with_replacement(options, 5)))

使用 itertools.combinations_with_replacement 的解决方案几乎肯定是最好的(无论如何在 Python 中),因为它既快速又易于使用。但是解决这个问题的递归算法是如此简单和漂亮,不展示它是一种耻辱。

为了确保rolls的组合是唯一的,我们只需要按排序顺序生成它。卷的每个组合都有一个唯一的排序,我们可以通过始终附加一个新值来生成每个排序组合,该新值至少与组合中的前一个值一样大。

将其翻译成 Python:

def rolls(n, k=6):
    '''Generate distinct rolls of n k-sided dice'''
    if n:
        for i in range(k, 0, -1):
            for roll in rolls(n-1, i):
                yield roll + [i]
    else:
        yield []

虽然可以通过将范围更改为 range(1, k+1).

轻松修改它以生成 colex 顺序,但它会以反向 colex 顺序生成组合

这将列出 Mathematica 中的所有 252 个排列。

Union[Sort /@ Tuples[Range[6], {5}]]