Python 空列表的随机总体
我必须用Python编写一个程序,其中我为2个空列表提供了一个范围和一些附加选项,因此该程序的方法应该如下所示: 给出可供选择的范围:10 给出选择的数量:5 我应该得到: 随机选择的数字列表:[2,3,7,1,8] 未选择的数字列表:[4,6,5,9,10] 数字不应重复,也不应出现在两个列表中 我有以下代码:Python 空列表的随机总体,python,Python,我必须用Python编写一个程序,其中我为2个空列表提供了一个范围和一些附加选项,因此该程序的方法应该如下所示: 给出可供选择的范围:10 给出选择的数量:5 我应该得到: 随机选择的数字列表:[2,3,7,1,8] 未选择的数字列表:[4,6,5,9,10] 数字不应重复,也不应出现在两个列表中 我有以下代码: import random selected_list=[] not_selected=[] selecting_number=int(input('give range to sel
import random
selected_list=[]
not_selected=[]
selecting_number=int(input('give range to select from : '))
select_num=int(input('give number of selections: '))
if selecting_number<select_num:
print('error')
elif selecting_number>=select_num:
for x in range(select_num):
selected_list.append(random.randint(1,select_num))
print(f'List of numbers selected randomly: {selected_list}')
if not_selected not in selected_list:
for y in range(select_num):
not_selected.append(random.randint(1,select_num))
print(f'List of numbers not selected previously: {not_selected}')
导致错误的原因是,
random
独立地拾取随机数,并且因为它们是随机的,所以有时会多次拾取相同的数
要解决此问题,可以使用random.sample(要从中选择的列表,要选择的编号)
从文档中:
返回从填充序列中选择的唯一元素的列表
或设置。用于无需更换的随机抽样
一个实施方案是:
import random
range_to_pick_from = list(range(1,10))
selected = random.sample(x, 5)
not_selected = [a for a in range_to_pick_from if a not in selected]
print(selected,not_selected)
not_selected
也可以编写为传统的for循环:
not_selected = []
for num in range_to_pick_from:
if num not in selected:
not_selected.append(num)
您可以创建一个函数来经常复制它,并接受您的参数
import random
def make_random_lists(my_range=10, selections=5):
"""
Generate two lists of random numbers.
INPUT
------
my_range - (int) how large the range we are selecting from
selections - (int) how many numbers should be in the list select list
OUTPUT
------
s - (list) the selected numbers
ns - (list) not selected numbers
"""
# make sure input values are valid
if (selections < my_range):
return "selections must be less than range", None
if my_range <= 0:
return "range must be larger than 0", None
total_numbers = set(range(1, my_range+1)) # make range
s = random.sample(total_numbers, k=selections) # get selections
ns = total_numbers - set(s) # find those not used
return s, list(ns)
文档
选项可以重复数字。但是你的种子会把它扫到地毯下面。那个地毯真的把房间连在一起了。@HeapOverflow,谢谢,改为,所以输出是一个唯一的填充值列表。你不应该使用assert来捕捉输入错误。见告诫1:
import random
def make_random_lists(my_range=10, selections=5):
"""
Generate two lists of random numbers.
INPUT
------
my_range - (int) how large the range we are selecting from
selections - (int) how many numbers should be in the list select list
OUTPUT
------
s - (list) the selected numbers
ns - (list) not selected numbers
"""
# make sure input values are valid
if (selections < my_range):
return "selections must be less than range", None
if my_range <= 0:
return "range must be larger than 0", None
total_numbers = set(range(1, my_range+1)) # make range
s = random.sample(total_numbers, k=selections) # get selections
ns = total_numbers - set(s) # find those not used
return s, list(ns)
selected, not_selc = make_random_lists(12, 4)
print(selected)
print(not_selc)
>>>[7, 5, 3, 4]
>>>[1, 2, 6, 8, 9, 10, 11, 12]