在Python中如何从给定列表中选择两个或多个随机数,这样数字的选择顺序与它们从中选择的列表中排列的相同?似乎random.choice只从中选择一个数字每次迭代的列表和前面所述的random.sample没有给出令人满意的答案。例如:
import random
a=['1','2','3','4','5','6','7','8']
b=['4','3','9','2','7','1','6','5']
c=random.sample(a,4)
d=random.sample(b,4)
print "c=",c
print "d=",d
代码给出了以下结果:
c=['4','2','3','8']
d=['1','9','5','4']
但我希望答案为:
c=['4','5','6','7']
d=['9','2','7','1']
或
c=['5','6','7','8']
d=['7','1','6','5']
答案 0 :(得分:0)
要随机获取两个样本,请使用random.sample
。首先,让我们定义一个列表:
>>> lst = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
现在,让我们随机获取两个样本:
>>> random.sample(lst, 2)
[13, 16]
>>> random.sample(lst, 2)
[10, 12]
无需更换即可完成抽样。
答案 1 :(得分:0)
看起来你想要从随机偏移开始的四个连续值,而不是序列中任何地方的四个值。所以不要使用sample
,只需选择一个随机起点(足够早以确保切片不会在list
的末尾运行并且最终比所需的短),然后从那里开始切四个元素:
import random
...
selectcnt = 4
cstart = random.randint(0, len(a) - selectcnt)
c = a[cstart:cstart + selectcnt]
dstart = random.randint(0, len(b) - selectcnt)
d = b[dstart:dstart + selectcnt]
你可以将它分解为更好一点(允许你进行单行选择):
import random
def get_random_slice(seq, slicelen):
'''Get slicelen items from seq beginning at a random offset'''
start = random.randint(0, len(seq) - slicelen)
return seq[start:start + slicelen]
c = get_random_slice(a, 4)
d = get_random_slice(b, 4)