我试图创建一个带有两个列表的函数,并从每个列表中随机选择一个元素。有没有办法使用random.seed函数?
答案 0 :(得分:20)
您可以使用random.choice
从序列中挑选随机元素(如列表)。
如果您的两个列表是list1
和list2
,那就是:
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()