Python输入班级人数N,随机抽x位同学核酸检测,抽五轮,前两次抽到的同学不再参与检测,输出每轮抽到的学号 非常感谢!!

img


输入班级人数N,学号1~N,随机抽x位同学核酸检测,抽五轮,前两次抽到的同学不再参与检测,输出每轮抽到的学号
可以想到用random,循环,列表,具体犯难


import random


def getRes(N, X):
    if N < X:
        return

    recordTwo = []       # 记录前两次被抽中过的
    result = []
    for i in range(5):
        epoch = []
        while len(epoch) < X:
            number = random.randint(1, N)          # 随机
            if i < 2:                              # 前两次可以直接随机,直到出现这一轮没有重复过的
                while number in epoch:
                    number = random.randint(1, N)
            else:                                  # 后面则同时需要这一轮没有重复过的,还需要没有同时出现在前两轮中的
                while number in epoch or (number in recordTwo[0] and number in recordTwo[1]):
                    number = random.randint(1, N)

            epoch.append(number)

        if i < 2:
            recordTwo.append(epoch)

        result.append(epoch)
    return result


N, X = map(int,input().split())
print(getRes(N, X))

首先是个list,这个没毛病。(命名为list1)把数填进去,就while和append,这个不难
然后赋值一个list2,list2 = list1,random.choice,从list2里面选,放入listRandom里面,然后del list2[],括号里面填你抽出来的数-1(因为索引比你的数小一)。这时候,循环X次。这种情况下,list2里面不再有你已经random出来的数字,而你random出来的数字会进到listRandom里面,然后输出。 这个就是第一个output。
然后清空list2,重复上面的循环(从list2 = list1开始),这就是第二次output,不过,要注意不能继续放入listRandom,随便定义个空list,放进去,这个是为了“前两次抽到的同学不再参与检测”。output完事之后,双for循环,判断listRandom和那个随便定义的空list 有哪些数重合了,然后del list1[],括号里面填数-1(因为索引比你的数小一),注意是list1。这样就确保“前两次抽到的同学不再参与检测”。
然后继续上述步骤,list2= list1。放入的话随便listRandom或者另一个都行(用的话必须得是空list,每次输出完事也要记得变成空list)
然后就可以了