python生成不重復隨機數(shù)和對list亂序的解決方法

轉載:https://www.jb51.net/article/137936.htm

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個不重復的數(shù),可以作為隨機下標集合,然后到list中取數(shù)

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

關于生成隨機的不重復數(shù),我被面試過兩次,有一次的應用場景是抽獎。

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

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

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

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容