天天看點

python生成不重複随機數和對list亂序

random.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函數(随機選取種子點)直接就能達到我要的結果,下次再寫抽獎函數一行代碼就搞定了。