-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrandom_draw.py
116 lines (105 loc) · 4.12 KB
/
random_draw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import sys
import random
import numpy as np
import time
RANDOM_SEED = int(time.time()*1000%1000000)
teams_per_group = 4
class RandomDraw:
def __init__(self,_all,_static,RANDOM_SEED=None):
self.rand = random.Random(RANDOM_SEED)
self.teams = {}
self.teams_static = {}
self.teams_random_num = []
self.teams_random_draw = []
self.teams_res = {}
self.res = {}
self._read_teams(_all,_static)
while True:
self.random()
res = self.check_valid()
if res:
break
def print_res(self):
for group in range(len(self.teams) // teams_per_group):
groups = {}
for i in range(teams_per_group):
ind = group*teams_per_group+i
if ind not in self.res:
print('Err33333333333')
groups[i] = self.res[ind]+" "+self.teams[self.res[ind]][1]
g = chr(ord('A')+group)
print("组别",g)
for n in groups:
print('\t',g+str(n),groups[n])
def check_valid(self):
for group in range(len(self.teams) // teams_per_group):
groups = {}
univset = set()
for i in range(teams_per_group):
ind = group*teams_per_group+i
if ind not in self.res:
print('Err33333333333')
groups[i] = self.res[ind]
univset.add(self.teams[self.res[ind]][0])
if len(univset) != teams_per_group:
return False
return True
def random(self):
self.teams_res = {}
self.res = {}
self.teams_random_draw = list(range(len(self.teams)))
for num in self.teams_static:
draw = self.teams_static[num]
if draw not in self.teams_random_draw:
print("Error11111")
self.teams_random_draw.remove(draw)
assert(len(self.teams_random_draw)==len(self.teams_random_num))
self.rand.shuffle(self.teams_random_draw)
self.teams_res.update(self.teams_static)
self.teams_res.update(dict(zip(self.teams_random_num,self.teams_random_draw)))
self.res = dict((v,k) for k,v in self.teams_res.items())
def _read_teams(self,_all,_static):
with open(_static) as f:
lines = f.readlines()
for l in lines:
info = l.split('\t')
num = info[0]
static_draw_temp = info[-1]
static_draw_group = ord(static_draw_temp[0])-ord('A')
static_draw_group_num = int(static_draw_temp[1])-1
static_draw = static_draw_group*teams_per_group+static_draw_group_num
if num in self.teams_static:
print("num {} exist more than once. !!!!!!!!!!".format(num))
self.teams_static[num] = static_draw
with open(_all) as f:
lines = f.readlines()
for l in lines:
info = l.split('\t')
if len(info) != 4:
print("error occur skip! ",info)
num = info[0]
name = (info[3]+"-"+info[1]).replace('\n','')
univ = info[3]
if num in self.teams:
print("num {} exist more than once. !!!!!!!!!!".format(num))
self.teams[num] = [univ,name]
if num not in self.teams_static:
self.teams_random_num.append(num)
print("total nums of team : {}".format(len(self.teams)))
def test_random(seed):
rand = random.Random(seed)
x = list(range(5))
print(x)
for i in range(4):
rand.shuffle(x)
print(x)
if __name__ == "__main__":
if len(sys.argv) != 3:
t_name = "teams_example.txt"
t_static_name = "teams_static_example.txt"
else:
t_name = sys.argv[1]
t_static_name = sys.argv[2]
print("seed : ",RANDOM_SEED)
draw = RandomDraw(t_name,t_static_name,RANDOM_SEED)
draw.print_res()