<p>我决定添加另一个答案,而不是编辑前一个答案,因为第一个答案在您不需要重组组的情况下仍然是有用的。在</p>
<p>所以,假设你有四种治疗方法-[A,B,C,D]</p>
<p>有三个条件:</p>
<ol>
<li><p><em>条件1</em>:玩家从这一组中随机进行3轮治疗,然后进行下一个(随机)治疗3回合等</p>
<p>我们可以将一个特定玩家的序列描述为一个列表:aaabbbccddd,其中一个字母对应于一个治疗,它在这个字符串中的位置对应于一个整数。</p></li>
<li><p>条件2:每一轮比赛中,有四名选手进行相同的治疗。</p></li>
<li><em>条件3:改组。这意味着没有任何球员在所有回合中都有完全相同的治疗顺序。所以,如果有人玩aaabbbccddd,没有人可以做同样的事情,而且要想在前三轮中成为A的四个玩家之一,另一个玩家需要有类似aaabbbddccc的东西。在</li>
</ol>
<p>因为人们总是连续打三个回合(比如AAA,或者BBB),为了简洁起见,让我们把三连体AAA描述为<strong>a</strong>,等等。因此aaabbbccddd将是<strong>ABCD</strong>。在</p>
<p>下面的代码生成一个12X16矩阵,每个玩家连续播放三次每个治疗,并且满足所有3个条件。在</p>
<p><strong>代码远远不是最优的</strong>,我相信经验丰富的python程序员可以很容易地以一种更高效的方式来实现这一点。但它是有效的。您只需将这个矩阵赋给任何<code>session.vars</code>变量,然后每个玩家就可以根据自己的id和整数获得他/她的治疗。在</p>
<p>函数<code>by_letters</code>比较两个序列,如果两个序列中的同一位置至少有一个字母,则返回<code>True</code>。因此它返回<code>abcd</code>和<code>bdca</code>的<code>True</code>,因为<code>c</code>,但它返回{<cd5>}和<code>badc</code>的<code>False</code>。在</p>
<p>我们在开始时生成了我们四种治疗方法的所有(24)种可能的排列。这是我们可以使用的序列库。在</p>
<p>函数<code>filtered</code>返回没有一致字母的可用序列的子集(基于<code>by_letters</code>函数)。在</p>
<p>当找到治疗矩阵时,<code>triple</code>函数只会重复每个治疗3次。在</p>
<p>因此,我们通过从我们的一组处理中产生排列来获得初始数据。在</p>
<p>我们从中选取一个随机序列,然后根据第一次绘制筛选出剩余的数据。这是我们的第二个序列。在</p>
<p>我们发现了两个集合的交集,这两个集合的字母都不与序列1和序列2都重合。然后从剩下的子集中我们画了一条随机线。这是我们的第三个序列。在</p>
<p>我们做同样的三个集合的交集来得到第四个序列。
这是我们的第一个4X4矩阵。
我们从初始数据中过滤出所有的序列(通过使用<code>itertools.filterfalse</code>),并使用初始数据循环四次,但是没有我们刚刚找到的序列。在</p>
<p>由于并非每次都能找到4个满足所有条件的4X4矩阵,我们用<code>try.. except..</code>来绘制另一个随机起始序列。在</p>
<pre><code>import random
import itertools
initial_data = list(itertools.permutations('abcd'))
def by_letters(a, b):
u = zip(a, b)
for i, j in u:
if i == j:
return True
return False
def filtered(what):
x = [i for i in a if not by_letters(i, what)]
return x
def triple(str):
return ''.join([c+c+c for c in str])
result = None
while result is None:
try:
matrices = []
a = initial_data
for i in range(4):
print('cycle:: ', i)
line1 = random.choice(a)
line2 = random.choice(filtered(line1))
s1 = set(filtered(line1))
s2 = set(filtered(line2))
sets = [s1, s2]
line3 = random.choice(list(set.intersection(*sets)))
s3 = set(filtered(line3))
sets = [s1, s2, s3]
line4 = random.choice(list(set.intersection(*sets)))
matrix1 = [line1, line2, line3, line4]
matrices.append(matrix1)
a = list(itertools.filterfalse(lambda x: x in matrix1, a))
result = matrices
except IndexError:
pass
final = [triple(j) for i in matrices for j in i]
print(final)
</code></pre>
<p>输出是这样的:</p>
^{pr2}$