python实现有一个列表A有30个数据,随机100次,每次随机从里面取一个数据,然后存到另一个列表B,但是要确保每次随机取得值和最近5次的值都不一样,而且列表A里面的每个数据在列表B里面至少出现3次
时间: 2024-02-20 14:58:54 浏览: 56
好的,这里给出一种实现方式。
首先,我们可以先定义一个包含 30 个数据的列表 `A`,一个空列表 `B` 用于存储选中的数据,以及一个字典 `count_dict` 用于记录每个数据在列表 `B` 中出现的次数。
接下来,我们可以使用 `random.choice()` 函数从 `A` 中随机选取一个数据,并判断其是否与最近 5 次选中的数据都不相同,并且在 `count_dict` 中对其出现的次数加 1。如果是,则将其加入到 `B` 中,并更新最近 5 次选中的数据。
在每次选中数据后,我们需要检查 `count_dict` 中记录的每个数据出现的次数是否都大于等于 3。如果有任何一个数据的出现次数小于 3,则需要重新选取数据,直到所有数据都满足出现次数大于等于 3。
具体实现代码如下:
```python
import random
A = [i for i in range(1, 31)]
B = []
count_dict = {i: 0 for i in A}
recent_data = []
while len(B) < 100:
# 从 A 中随机选择一个数据
data = random.choice(A)
# 判断选中的数据是否与最近 5 次选中的数据都不相同
if len(recent_data) < 5 or data not in recent_data:
B.append(data)
recent_data.append(data)
# 最近 5 次选中的数据只保留最后 5 个
if len(recent_data) > 5:
recent_data.pop(0)
# 在 count_dict 中记录选中的数据出现的次数
count_dict[data] += 1
# 检查每个数据是否都出现了至少 3 次
all_appear_more_than_3 = all(count_dict[data] >= 3 for data in A)
if not all_appear_more_than_3:
# 如果有数据出现次数小于 3,则需要重新选取数据
B.pop()
count_dict[data] -= 1
recent_data.pop()
else:
# 如果选中的数据与最近 5 次选中的数据有重复,则重新选择
while data in recent_data:
data = random.choice(A)
B.append(data)
recent_data.append(data)
if len(recent_data) > 5:
recent_data.pop(0)
count_dict[data] += 1
all_appear_more_than_3 = all(count_dict[data] >= 3 for data in A)
if not all_appear_more_than_3:
B.pop()
count_dict[data] -= 1
recent_data.pop()
print(B)
```
这个程序会输出一个包含 100 个数据的列表 `B`,其中每个数据都满足与最近 5 次选中的数据都不相同的要求,并且列表 `A` 中的每个数据在列表 `B` 中都至少出现了 3 次。
阅读全文