【发布时间】:2020-10-08 23:48:52
【问题描述】:
由于 6 组代表骰子,因此这些组中整数的顺序无关紧要。每组中组的顺序确实很重要,但要检查每个组,找到每组的排列很简单,我可以做到。
现在,我想出了一个方法来实现这一切,问题是效率。我想检查每一组,但到目前为止我只想出了一种方法:
for i in itertools.combinations(num, 6):
W.append([i])
print(W)
print("Done building list of ",len(W)," possible dice.")
这给了我从 18 个整数中选择的 6 个数字的所有可能骰子,其中数字的顺序无关紧要。这是 18,564 组,每组 6 个。然后,我使用以下方法找到这些骰子的组合:
for j in itertools.combinations(W, 3):
check = list(itertools.chain(*list(itertools.chain(*j))))
check = sorted(check)
#print(check)
if check == num:
问题在于第二个组合将迭代 10^15 种可能性,而我想要生成的只是其中的一小部分。
我还有一个问题:
我很确定将 18 个事物分配给 3 个不同的 6 个组的总方法,其中组内的顺序无关紧要:18!/(6!)^3 ~ 1700 万种方式,可以相对快速地迭代。这是正确的吗?有没有一种方法可以迭代地生成这些方式,而无需过滤更多的可能性?
最后一点:
我正在尝试生成所有非传递六面骰子集,其中每个骰子的每个面都有不同的数字。我已经有代码可以检查一组并确定它是否符合此条件并存储最佳结果,即骰子击败下一个骰子的最高概率。
for k in itertools.permutations(j):
B = k[0]
G = k[1]
R = k[2]
b = 0
g = 0
r = 0
for m in B:
for n in G:
if m > n:
b = b + 1
else:
continue
for m in G:
for n in R:
if m > n:
g = g + 1
else:
continue
for m in R:
for n in B:
if m > n:
r = r + 1
else:
continue
w = w + 1
print(w)
if b <= 18 or g <= 18 or r <= 18:
continue
else:
if b >= blue and g >= green and r >= red:
Blue = B
blue = b
Green = G
green = g
Red = R
red = r
print(B)
print(b/36)
print(G)
print(g/36)
print(R)
print(r/36)
continue
else:
continue
else:
continue
【问题讨论】:
-
这和Partitions of Groups of Equal Size的想法一样吗?
-
哦,哇,这看起来很有希望,谢谢。我尝试了很长时间在这个网站和其他网站上搜索这个问题,但它是关于找到正确的关键词。我会看看这个,谢谢。另外,我可以在python中轻松实现吗?我有点像新手,尤其是在涉及不同语言和实现库等方面。
标签: python set combinations permutation