2014-04-03 148 views
99

我知道如何在Python範圍內生成一個隨機數。在一個範圍內生成'n'個唯一隨機數

random.randint(numLow, numHigh) 

而且我知道我可以把這個在一個循環產生這些數字

for x in range (0, n): 
    listOfNumbers.append(random.randint(numLow, numHigh)) 

不過,我需要確保在該列表中的每個數字都是獨特的施氮量。除了加載條件語句之外,還有一種簡單的方法可以生成n個唯一的隨機數字嗎?

編輯:重要的是,在列表中的每個數字是別人不同..

所以

[12,5,6,1] =好

[12,5,5,1] =壞,因爲數字5出現兩次。

+0

請看:[創建在Python整數隨機列表(http://stackoverflow.com/questions/4172131/create-random-list-of-integers-in-python)。 – alecxe

+1

如何爲StackExchange本身提供建議。不應該重複的通知包含重複的鏈接? –

回答

167

如果你只需要不放回抽樣:

>>> import random 
>>> random.sample(range(1, 100), 3) 
[77, 52, 45] 

random.sample需要人口,樣本大小k和返回的k隨機成員人口。

如果你要控制的地方klen(population)大的情況下,你需要準備搭上ValueError

>>> try: 
... random.sample(range(1, 2), 3) 
... except ValueError: 
... print('Sample size exceeded population size.') 
... 
Sample size exceeded population size 
+16

使用'random.sample(xrange(1,100),3)' - 用** xrange **代替範圍 - 加快了代碼的速度,特別是如果你有很大的範圍,因爲它只會產生按需所需的3個數字(或更多,如果沒有更換的樣品需要它),但不是整個範圍。例如:'%timeit random.sample(xrange(10000),3)'=每循環4.92微秒,'%timeit random.sample(範圍(10000),3)'=每循環126微秒 – gaborous

+12

如果您正在使用Python2,是的。如果你在我的答案中使用Python 3,它已經這樣做了,因爲Py3k中的xrange - > range。 –

+0

我們可以不用在'try ... except'塊中包含'random.sample()'調用,而是檢查樣本的大小(上面的'3')是小於還是等於('<=')比人口的大小(上述'範圍(1,2)')大。 – h4k1m

13

首先生成數據的範圍,然後將它洗像這樣

import random 
data = range(numLow, numHigh) 
random.shuffle(data) 
print data 

通過這樣做,你會得到在特定範圍內的所有數字,但按隨機順序。

但是你可以用random.sample得到你需要的元素個數,從一系列數字像這樣

print random.sample(range(numLow, numHigh), 3) 
12

,直到你達到n你可以添加到set

setOfNumbers = set() 
while len(setOfNumbers) < n: 
    setOfNumbers.add(random.randint(numLow, numHigh)) 

請小心使用比n更小的範圍。它會永遠循環下去,無法找到新號碼插入多達n

+0

如果你使用'random.sample',它會爲這種情況拋出一個'ValueError'(當然你可以捕獲它)。 –

3

你可以使用random.sample功能從standard library選擇從ķ元素人口

import random 
random.sample(range(low, high), n) 

在相當大的情況下,可能的數字範圍,你可以使用itertools.islice具有無限隨機生成:

import itertools 
import random 

def random_gen(low, high): 
    while True: 
     yield random.randrange(low, high) 

gen = random_gen(1, 100) 
items = list(itertools.islice(gen, 10)) # take first 10 random elements 

UPDATE

所以,問題後更新現在很清楚,你需要ñ不同的(唯一的)數字。

import itertools 
import random 

def random_gen(low, high): 
    while True: 
     yield random.randrange(low, high) 

gen = random_gen(1, 100) 

items = set() 

# try to add elem to set until set length is less than 10 
for x in itertools.takewhile(lambda x: len(items) < 10, gen): 
    items.add(x) 
相關問題