【问题标题】:Dependent probabilities find out the different combinations of rolls that add up to a certain number when rolling two dice相关概率找出掷两个骰子时加起来达到一定数量的不同掷骰组合
【发布时间】:2021-02-02 11:01:09
【问题描述】:

我正在尝试创建一个算法来计算滚动两个骰子加起来达到某个数字的相关概率。相关概率部分很好,但我试图找到所有可能的数字组合。一次掷两个骰子意味着你的数字范围是 2 到 12。我想找出一个双面骰子的所有不同组合,它们的总和会是一个目标数字。

例如,如果目标数是 8: 不同组合的数量如下: (2,6)(6,2)(5,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) 加起来八 但是上面的代码不包括其他组合(6,2)

另一个目标编号为 8 的示例: (4,4) 加起来是 8 个,但在上述代码的输出中不包括在内。

我的最终目标是算法能够找到更大数字的所有可能组合,例如25.我想知道是否有基于现有代码或新代码的解决方案可以解决上述问题。最好是使用 python 的解决方案,但是我对其他语言持开放态度。

【问题讨论】:

  • 如果您在不替换单个单调递增序列的情况下进行组合,则无法获得 (x,x) 之类的东西,并且组合中的顺序无关紧要,因此您不会同时获得 (x ,y) 和 (y,x)。听起来您想要置换而不是组合的排列。或者从序列的 n 个副本中采样。

标签: python algorithm combinations


【解决方案1】:

根据您之后对这些分区所做的操作,可能会有更好的算法,但我认为这就是您所要求的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多