python实现有一个列表有30个数据,随机100次,每次随机从里面取一个数据,如何随机取得值和最近几次都不一样
时间: 2024-02-20 10:58:42 浏览: 20
可以使用`random.sample()`方法来实现从列表中随机取出不重复的元素。每次取出一个元素后,可以将该元素从列表中删除,这样下一次随机取值时就不会重复。同时,可以记录下最近几次取出的值,每次随机前判断当前元素是否在最近几次内出现过,若出现就重新随机取值,直到取到一个最近几次都没有出现过的元素。
以下是示例代码:
```python
import random
lst = list(range(30)) # 初始化列表
recent = [] # 记录最近几次取出的值
for i in range(100):
if len(recent) >= 5: # 最近几次记录达到5个,删除最早的一个
recent.pop(0)
while True:
val = random.sample(lst, 1)[0] # 随机取出一个不重复的元素
if val not in recent: # 判断当前元素是否在最近几次内出现过
recent.append(val)
lst.remove(val) # 从列表中删除该元素
print(val)
break
```
注意:该代码中假设列表中的元素是不重复的,若列表中存在重复元素,则需要使用其他方法来判断是否重复。
相关问题
python实现有一个列表有30个数据,随机100次,每次随机从里面取一个数据,然后存到另一个列表,但是要确保每次随机取得值和最近5次的值都不一样
好的,我来给你提供一种实现方式。
首先,我们可以先定义一个包含 30 个数据的列表 `all_data`,一个空列表 `selected_data` 用于存储选中的数据,以及一个变量 `recent_data` 用于记录最近 5 次选中的数据。
接下来,我们可以使用 `random.choice()` 函数从 `all_data` 中随机选取一个数据,并判断其是否与最近 5 次选中的数据都不相同。如果是,则将其加入到 `selected_data` 中,并更新 `recent_data`。
具体实现代码如下:
```python
import random
all_data = [i for i in range(1, 31)]
selected_data = []
recent_data = []
for i in range(100):
# 从 all_data 中随机选择一个数据
data = random.choice(all_data)
# 判断选中的数据是否与最近 5 次选中的数据都不相同
if len(recent_data) < 5 or data not in recent_data:
selected_data.append(data)
recent_data.append(data)
# 最近 5 次选中的数据只保留最后 5 个
if len(recent_data) > 5:
recent_data.pop(0)
else:
# 如果选中的数据与最近 5 次选中的数据有重复,则重新选择
while data in recent_data:
data = random.choice(all_data)
selected_data.append(data)
recent_data.append(data)
if len(recent_data) > 5:
recent_data.pop(0)
print(selected_data)
```
这个程序会输出一个包含 100 个数据的列表 `selected_data`,其中每个数据都满足与最近 5 次选中的数据都不相同的要求。
python实现有一个列表A有30个数据,随机100次,每次随机从里面取一个数据,然后存到另一个列表B,但是要确保每次随机取得值和最近5次的值都不一样,而且列表A里面的每个数据在列表B里面至少出现3次
好的,这里给出一种实现方式。
首先,我们可以先定义一个包含 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 次。