实在是想不出来了,求帮看一眼,给一点思路。
python题,输入班级人数n,每轮随机抽取x位,前两轮被连续抽到的学生第三次不被抽到(但是之后第四第五轮可以),抽五轮,输出每轮抽到的学生学号
设置一个标志位 flag
flag = 0
第一次比如说抽到 1 令flag 为1
第二次 还是1 令flag =-1; 不为1 :flag= 0
第三次 为1 且 flag = -1 再抽一次; 为1 且flag != -1 ,输出
import random
def main(param: dict):
n = param["班级人数"]
# n = 100 # 班级人数
times = param["抽奖次数"]
# times = 5 # 抽奖次数
x = param["每一轮抽到的数量"]
# x = 20 # 所有抽奖轮都抽取20个
# # x = [20, 20, 10, 30, 40] # 不同抽奖轮抽取不同数量, 长度需要和上面times一致!
if type(x) is int:
xx = [x] * times
else:
xx = x
d = dict()
for time in range(1, times+1): # 共times轮抽奖
isStudentId = [] # 收集当前抽奖轮被抽中的学生学号
for i in range(100000): # 开始抽奖, 迭代直到人数足够, 进入下一轮
Id = random.randint(1, n+1) # 从学号1-100中随机抽取一个
if Id not in isStudentId: # 如果该学号没有被抽取过
if len(isStudentId) < xx[time-1]: # 该轮抽奖未抽够x位学生
if Id not in d: # 如果字典中没有记录有该名学生的信息
isStudentId.append(Id) # 收集当前抽奖轮被抽中的学生学号
d[Id] = [time] # key=学号, value=[第几轮抽奖]
else: # 如果字典中有记录有该名学生的信息
if len(d[Id]) > 1: # 如果信息记录数量大于1次
if d[Id][-1] - d[Id][-2] != 1: # 判断信息记录中最后两次是否为连续抽到, 如果不是连续抽到, 执行下面的代码
isStudentId.append(Id) # 收集当前抽奖轮被抽中的学生学号
d[Id].append(time) # 将信息记录在字典中
else:
isStudentId.append(Id) # 收集当前抽奖轮被抽中的学生学号
d[Id].append(time) # 将信息记录在字典中
if len(isStudentId) == xx[time-1]:
break
for k, v in d.items():
print("抽中学号->", k, "被抽中的轮:", v)
cc = []
for i in range(1, 6):
c = []
for k, v in d.items():
if i in v:
c.append(k)
cc.append(c)
for time, i in enumerate(cc):
print("第" + str(time+1) + "次抽奖结果:", i)
return d, cc # d: dict-> 被抽出学生分布情况, cc: list -> 每轮抽奖情况
if __name__ == '__main__':
api_param = {
"班级人数": 50, # 班级人数n
"抽奖次数": 5, # 抽奖轮数
"每一轮抽到的数量": 10, # 随机抽取数量x, 这个数量尽量不要太接近班级人数, 否则不连续抽中3次这个条件冲突导致抽不到人
# "每一轮抽到的数量": [20, 20, 10, 30, 40], # 不同抽奖轮抽取不同数量, 列表长度需要和上面times一致! | 这个数量尽量不要太接近班级人数, 否则不连续抽中3次这个条件冲突导致抽不到人
}
main(api_param)
...
抽中学号-> 16 被抽中的轮: [5]
抽中学号-> 24 被抽中的轮: [5]
抽中学号-> 43 被抽中的轮: [5]
第1次抽奖结果: [38, 37, 14, 40, 49, 12, 15, 46, 17, 23]
第2次抽奖结果: [38, 29, 4, 45, 25, 9, 21, 41, 1, 18]
第3次抽奖结果: [12, 17, 29, 25, 33, 8, 35, 31, 32, 10]
第4次抽奖结果: [40, 46, 23, 21, 35, 20, 50, 51, 13, 27]
第5次抽奖结果: [45, 21, 10, 51, 30, 5, 42, 16, 24, 43]