Python 具有特定规则的组合数

Python 具有特定规则的组合数,python,combinatorics,Python,Combinatorics,我想找出以下问题的组合数: 共有4个部分。每个部分包含12个类别。每个类别依次包含3种类型。A、 B和C。对于每个部分,您必须选择3种类型。类别只能拾取一次,每个部分必须有一种类型。结果可能如下所示: S1 C1 TA C2 TB C3 TC S2 C4 TA C5 TB C6 TC S5 C7 TA C8 TB C9 TC S4 C10 TA C11 TB C12 TC 或 我已经到了解决这个问题

我想找出以下问题的组合数:

共有4个部分。每个部分包含12个类别。每个类别依次包含3种类型。A、 B和C。对于每个部分,您必须选择3种类型。类别只能拾取一次,每个部分必须有一种类型。结果可能如下所示:

S1
    C1 TA
    C2 TB
    C3 TC
S2
    C4 TA
    C5 TB
    C6 TC
S5
    C7 TA
    C8 TB
    C9 TC
S4
    C10 TA
    C11 TB
    C12 TC


我已经到了解决这个问题的极限。我尝试过循环,只是过滤掉了不好的结果,但我真的无法让它工作。我想在这方面得到一些帮助。谢谢。

需要编写脚本来计算吗?这完全可以用数学来完成。我的组合数学的确有些生疏,但我的想法是,这个问题归结为

(3! * choose(12, 3)) * (3! * choose(9, 3)) * (3! * choose(6, 3)) * (3! * choose(3, 3))

这很好地简化为
12。您也可以轻松地将其推广到任意数量的类别、节、每个类别的节和类型。我只是不确定你为什么需要为此编写脚本,除非是为了作业,在这种情况下,你应该发布你的代码,并解释你的思维过程和问题。

一种简单的方法可以稍微分解一下逻辑,如下所示:

您需要将12个类别随机分成4个部分。这是一个很好的工具

categories = range(1,13) # 1-based
# now you can use random.shuffle to shuffle it in place
import random
random.shuffle(categories) # now categories is shuffled.
# split the categories evenly between the 4 sections
sections = [categories[3*i:3*(i+1)] for i in range(4)]
现在,您需要将这3种类型随机分配到每个部分的类别中

如果您不喜欢使用
zip
,您可以自己构建
(类别、类型)
元组:

for section in sections:
    final.append([])
    for i, t in enumerate(rand_types()):
        final[-1].append((section[i], t))

你的问题是什么?你能发布你已经尝试过的示例代码吗?这意味着。。。你有4个S和12个位置!C和3的位置!T的位置?我从这样一个事实中得出结论:秩序是重要的,没有重复。->更像是每一个的排列。如果是这样,这将是一个巨大的数字。
# lets make a function that returns a randomly ordered sequence of types 1,2,3
def rand_types():
    types = [1,2,3]
    random.shuffle(types)
    return types
# now we can use this for each assignment
final = []
for section in sections:
     final.append(zip(section, rand_types()))
# [[(8, 2), (5, 1), (10, 3)], 
#  [(6, 2), (7, 3), (2, 1)], 
#  [(4, 1), (12, 3), (1, 2)], 
#  [(11, 2), (3, 1), (9, 3)]]
for section in sections:
    final.append([])
    for i, t in enumerate(rand_types()):
        final[-1].append((section[i], t))