这是我用于生成包含n个成员和x组的组的代码。然后根据每组中有多少相似的数字对每组进行评级,例如(1,1,1,1)= 1,因为只有1个数字,但是(1,2,3,3)= 3,因为有3个数字。我试着给它做一个循环,直到这个地方的9个组中的任何一组的速率低于某个z值,但是由于某种原因它没有起作用。任何人都可以提出一种方法来根据最后的评级数来循环这个系统吗?
import numpy
import math
import random
members=4
n_groups =4
participants=list(range(1,members+1))*n_groups
#print participants
random.shuffle(participants)
with open('myfile1.txt','w') as tf:
for i in range(n_groups):
group = participants[i*members:(i+1)*members]
for participant in group:
tf.write(str(participant)+' ')
tf.write('\n')
with open('myfile1.txt','r') as tf:
g = [list(map(int, line.split())) for line in tf.readlines()]
print(g)
my_groups =g
def get_rating(group):
return len(set(group))
for each_grp in my_groups:
print(get_rating(each_grp))
在这种情况下的输出: [[1,4,2,3],[3,4,4,2],[1,1,2,3],[3,4,2,1]] 4 3 3 4
我已将其简化为4名成员,4组:
[[1,4,2,3],[3,4,4,2],[1,1,2,3],[3,4,2,1]] 4(因为第1组有4个不同的数字) 3(因为第2组有3个不同的数字) 3(因为第3组有3个不同的数字) 4(因为第4组有4个不同的数字)
方括号中的东西是4组,下面的4个数字对它进行评分。我试图得到一个循环,继续尝试它,直到说最后每组的4个评级数中的一个下降到1,然后将停止
所以我想要一个循环来继续生成新的组,直到组下面的评级数字(在这种情况下:4,3,3,4)低于某个值,如2,2,2,2
答案 0 :(得分:1)
一种有点天真的方法是将整个程序包装成一个while循环,检查所有组的分数。类似的东西:
# WARNING, UNTESTED CODE
my_groups = []
while any([get_rating(g) for g in groups] lambda x: x < 2):
# ...Do e'rythang else...
更明智的做法是逐个查看您的群组,并在每次 之前获得评分
*已更新为工作代码*
import numpy
import math
import random
members=4
n_groups =4
participants=list(range(1,members+1))*n_groups
#print participants
random.shuffle(participants)
def get_rating(group):
return len(set(group))
with open('myfile1.txt','w') as tf:
for i in range(n_groups):
group = participants[i*members:(i+1)*members]
# right here
while(get_rating(group) < 2):
# Do it again
random.shuffle(participants)
group = participants[i*members:(i+1)*members]
# now right it
for participant in group:
tf.write(str(participant)+' ')
tf.write('\n')
with open('myfile1.txt','r') as tf:
g = [list(map(int, line.split())) for line in tf.readlines()]
print(g)
my_groups =g
for each_grp in my_groups:
print(get_rating(each_grp))
答案 1 :(得分:1)
您也可以使用numpy
import numpy as np
def get_groups(members, n_groups):
return np.random.randint(1, 5, (n_groups, members))
g = get_groups(4, 4)
while not 1 in [np.unique(sub_g).shape[0] for sub_g in g]:
g = get_groups(4, 4)
其中:
np.random.randint(1, 5 (n_groups, members))
生成n_groups
个members
组,其中填充了range(1, 5)
np.unique(sub_g).shape[0]
获取您的评分(组中唯一值的数量)[np.unique(sub_g).shape[0] for sub_g in g]
为g
while not 1 in
重复循环,直到在上面计算的列表中找到值1
(组中的所有值都相等)g = get_groups(4, 4)
重复第1步