想要在python中从给定的数字列表中选择多个随机数

时间:2016-09-18 06:46:31

标签: python python-2.7 random

在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']

2 个答案:

答案 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)