2011-12-01 113 views
4

我试图创建一个函数,它需要两个列表并从它们每个中随机选择一个元素。有没有办法使用random.seed函数来做到这一点?在Python中选择一个随机列表元素

+0

确定性地(伪随机)或完全随机?考虑是否要保留两个单独的RNG,每个列表一个? – smci

回答

19

您可以使用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 
+0

我给出了下面的OO版本(从* list *继承并定义了一个方法* getranditem()*)。开始调用*'random.seed()'*不是很简单,所以最好用一个对象的*'__init __()'*或*'seed()'*方法来封装。 – smci

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}) 

是指随机还不够吗?

-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() 
+6

'使用对象'与'面向对象'不同。这个解决方案在理论上没有任何问题,但实际上它比F.J's复杂得多。为了什么好处? –

+0

@Matt:当它只允许你做有意义的操作时,它是面向对象的。如果您在错误列表中使用了错误的RNG会怎么样?如果你接种了错误的RNG,那么使用另一个名单中的那个呢? (我写的代码也包含了一个单独的RNG,但没有发布它。) – smci

+0

刚刚注意到是因为你的编辑,但是你确定这是一个好主意吗?random.choice()用你的'.choice()',特别是如果你想避免混淆。 – beroe

相关问题