我正在尝试创建一个算法来计算滚动两个骰子加到一定数量的依赖概率。相关概率部分很好,但我试图找到所有可能的数字组合。一次掷两个骰子意味着你的数字范围将从2到12。我想找出一个双面骰子的所有不同组合,加起来能得到一个目标数字。
例如目标数为8:不同组合的数量如下:(2,6)(2)(3)(3、5)(4,4)(2,2,2,2)(3、3、2)(2、3、3)(3 2 3)
我能创建的唯一用于查找数字组合的代码是下面的代码:
source = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
targets = [25]
p = [[a for n in range(2, 13) for a in it.combinations(source, n) if sum(a) == t] for t in targets]
[dict(zip(targets, a)) for a in it.product(*p) if len(sum(a, tuple())) == len(set(sum(a, tuple())))]
print(p)
上面代码的问题是,它没有显示所有不同顺序的不同组合,也没有显示重复的数字组合。
以目标编号为8为例:(2,6)加起来是8然而,上面的代码不包括其他组合(6,2)
另一个目标数为8的例子:(4,4)加起来是8,然而,在上述代码的输出中没有包含。
我的最终目标是该算法能够找到更大数字(例如25)的所有可能组合。我想知道是否有基于现有代码或解决上述问题的新代码的解决方案。最好的解决方案是在python然而,我是开放的其他语言。
根据你之后如何处理这些分区,可能会有一个更好的算法,但我认为这是你想要的。
def all_rolls_with_sum(target):
if target == 0:
yield []
return
for roll in range(2, min(target, 12) + 1):
for rolls in all_rolls_with_sum(target - roll):
rolls.append(roll)
yield rolls
import pprint
pprint.pprint(list(all_rolls_with_sum(8)))
输出:
[[2, 2, 2, 2],
[4, 2, 2],
[3, 3, 2],
[2, 4, 2],
[6, 2],
[3, 2, 3],
[2, 3, 3],
[5, 3],
[2, 2, 4],
[4, 4],
[3, 5],
[2, 6],
[8]]