具有设定范围和总和的骰子的所有排列

时间:2016-10-28 20:53:14

标签: python permutation dice

我需要找出总共35(m)的10个骰子(n)的所有排列。我是python的新手,并且陷入了for循环。这是我到目前为止所得到的:

import itertools

dice = [1,2,3,4,5,6]

def subsets(n,m):

     perms = itertools.permutations(dice,n)
     for i in perms:
         if sum(i) == m
         yield perms
     else:
         return

print(list(subsets(10,35)))

4 个答案:

答案 0 :(得分:2)

第一个问题是你不想要排列。排列不包括重复(即每个骰子滚动不同的数字)。没有10个骰子的排列。

这应该是product(如果您想以不同方式计算(1,1,1,1,1,2)(1,1,1,1,2,1))或combinations_with_replacement(如果您不是)。我假设后者*。

然后,这里出现语法错误:

     if sum(i) == m
     yield perms

应该有一个冒号和一个缩进的块。此外,它应该可能产生当前项目(i):

     if sum(i) == m:
         yield i

这没有任何作用,因为函数无论如何都会完成:

 else:
     return

因此,该函数的固定版本将是:

def subsets(n,m):
     perms = itertools.combinations_with_replacement(dice, n)
     for i in perms:
         if sum(i) == m:
             yield i

当然,这可以简化为:

def subsets(n,m):
    return (p for p in itertools.combinations_with_replacement(dice,n) if sum(p) == m)

*请注意,对于productsubsets(10,35)会产生4395456个结果,而使用combinations_with_replacement会得到141个结果。

答案 1 :(得分:0)

from itertools import product

dice = [1, 2, 3, 4, 5, 6]

def subsets(n, m):
    for i in product(dice, repeat=n):
        if sum(i) == m:
            yield i

因此,您的代码中存在各种问题:

  • for循环不对,它是一个需要正确缩进和分号的代码块。
  • if块的else部分错误地设置在for循环缩进级别。
  • 刚返回的else语句将结束函数的执行。
  • 您正在产生排列对象,您应该产生for循环的实例。
  • 您需要itertools.product才能获得N个骰子的可能组合。

答案 2 :(得分:0)

除了要使用的itertools函数外,Dalvenjia有正确的想法。如果您想掷出n骰子,则需要使用itertools.product(dice, repeat=n)

答案 3 :(得分:0)

我认为当掷出一定数量的骰子以获得特定总数时,您需要所有排列。

from itertools import product
dices, total = 10, 35
print([p for p in product(list(range(1,7)), repeat = dices) if sum(p)==total])