2011-12-01 110 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

相關問題