首頁  >  文章  >  後端開發  >  python產生不重複隨機數和對list亂序的解決方法

python產生不重複隨機數和對list亂序的解決方法

不言
不言原創
2018-04-09 15:05:572104瀏覽

以下為大家分享一篇python產生不重複隨機數和對list亂序的解決方法,具有很好的參考價值,希望對大家有幫助。

andom.sample(list, n)即是從list中隨機選取n個不同的元素

# -*- coding: utf-8 -*- 
import random 
# 从一个list中随机挑选5个 
list = [12, 23, 13, 14, 78, 234, 123, 12345] 
randomlist = random.sample(list, 5) 
print randomlist 
 
# 在range(10)中随机生成5个不重复的数,可以作为随机下标集合,然后到list中取数 
len = list.__len__() 
indexList = range(len) 
randomIndex = random.sample(indexList, 5) 
for i in randomIndex: 
 print "下标为%d" % i 
 print list[i]

對list進行洗牌,亂序排序,random.shuffle(list),注意原來的list會被改變

#
# -*- coding: utf-8 -*- 
import random 
# 对list洗牌,在原list上做改变 
list = range(10) 
print list 
random.shuffle(list) 
print "随机排序列表 : ", list

關於生成隨機的不重複數,我被面試過兩次,有一次的應用場景是抽獎。

我當時提出的解決方案是:將生成的隨機數(數組的隨機下標)放在一個數組中,每次對新生成的隨機數首先判斷是否已經存在,如果不存在就加入這個數組,如果存在就重新產生隨機數,直到這個數組中的元素個數到達一個特定值,然後拿著這個隨機下標數組到原始數組去取一個元素。面試官問我時間複雜度問我是多少,我說O(n^2),面試官問我有沒有改進方案,我想了一會兒沒想出來。

回到宿舍後舍友說,你可以每次對選中的元素和最後元素交換以下,下一次生成隨機數的時候就在前n-1個元素中生成,這樣每次只要交換一次元素,就不用去那個數組中判斷當前下標是否已經被生成過一次,時間複雜度變成O(n),不由佩服。

Java中提供了list.contains(ele)函數,可以直接判斷指定容器中是否存在某個元素,這樣就不用寫二重循環了,但是時間複雜度仍然是O(n^2)

不過今天看了一下python中的sample函數(隨機選取種子點)直接就能達到我要的結果,下次再寫抽獎函數一行程式碼就搞定了。

相關推薦:

python中隨機取list中的元素方法

以上是python產生不重複隨機數和對list亂序的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn