独特的骰子组合
Unique combinations of dice
我正在尝试为 Yahtzee(一种骰子游戏)建模。
作为第一步,我尝试枚举同时掷出的 5 个骰子的所有可能组合。我只想要独特的组合(例如 5,5,5,4,4
与 5,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}]]
我正在尝试为 Yahtzee(一种骰子游戏)建模。
作为第一步,我尝试枚举同时掷出的 5 个骰子的所有可能组合。我只想要独特的组合(例如 5,5,5,4,4
与 5,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)
.
这将列出 Mathematica 中的所有 252 个排列。
Union[Sort /@ Tuples[Range[6], {5}]]