在python中选择一个随机列表元素

时间:2011-12-01 18:02:58

标签: python list

我试图创建一个带有两个列表的函数,并从每个列表中随机选择一个元素。有没有办法使用random.seed函数?

3 个答案:

答案 0 :(得分:20)

您可以使用random.choice从序列中挑选随机元素(如列表)。

如果您的两个列表是list1list2,那就是:

a = random.choice(list1)
b = random.choice(list2)

您确定要使用random.seed吗?这将每次以一致的方式初始化随机数生成器,如果您希望后续运行相同但通常不需要,这将非常有用。例如,以下函数将始终返回8,即使它看起来应该随机选择0到10之间的数字。

>>> def not_very_random():
...     random.seed(0)
...     return random.choice(range(10))
... 
>>> not_very_random()
8
>>> not_very_random()
8
>>> not_very_random()
8
>>> not_very_random()
8

答案 1 :(得分:1)

注意:@ F.J的解决方案要复杂得多,而且更好。


使用random.randint从列表中选择伪随机索引。然后使用该索引选择元素:

>>> import random as r
>>> r.seed(14)   # used random number generator of ... my head ... to get 14
>>> mylist = [1,2,3,4,5]
>>> mylist[r.randint(0, len(mylist) - 1)]

您可以轻松地将其扩展为两个列表。

为什么要使用random.seed


示例(使用Python2.7):

>>> import collections as c
>>> c.Counter([mylist[r.randint(0, len(mylist) - 1)] for x in range(200)])
Counter({1: 44, 5: 43, 2: 40, 3: 39, 4: 34})

那是否足够随意?

答案 2 :(得分:-1)

我完全重复了之前的回答。这是一个包含列表的随机数生成器(带有可选种子)的类。这是对F.J.的一个小改进,因为它给出了测试的确定性行为。在第一个列表上调用choice()不应影响第二个列表,反之亦然:

class rlist ():
    def __init__(self, lst, rg=None, rseed=None):

        self.lst = lst

        if rg is not None:
            self.rg = rg
        else:
            self.rg = random.Random()
            if rseed is not None:
                self.rg.seed(rseed)

    def choice(self):
         return self.rg.choice(self.lst)

if __name__ == '__main__':
    rl1 = rlist([1,2,3,4,5], rseed=1234)
    rl2 = rlist(['a','b','c','d','e'], rseed=1234)

    print 'First call:'
    print rl1.choice(),rl2.choice()
    print 'Second call:'
    print rl1.choice(),rl2.choice()