2014-04-03 24 views
99

Tôi biết cách tạo một số ngẫu nhiên trong một phạm vi bằng Python.Tạo các số ngẫu nhiên duy nhất trong một phạm vi

random.randint(numLow, numHigh) 

Và tôi biết tôi có thể đặt điều này trong một vòng lặp để tạo ra số lượng n của những con số này

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

Tuy nhiên, tôi cần phải chắc chắn rằng mỗi số trong danh sách đó là duy nhất. Khác với tải trọng của các câu lệnh có điều kiện, có một cách đơn giản để tạo số n số ngẫu nhiên duy nhất không?

EDIT: Điều quan trọng là mỗi số trong danh sách này là khác nhau đối với những người khác ..

Vì vậy

[12, 5, 6, 1] = tốt

Nhưng

[12, 5, 5, 1] ​​= xấu, vì số 5 xảy ra hai lần.

+0

Hãy xem: [Tạo danh sách ngẫu nhiên các số nguyên trong Python] (http://stackoverflow.com/questions/4172131/create-random-list-of-integers-in-python). – alecxe

+1

Làm cách nào để tạo đề xuất cho chính StackExchange. Không nên thông báo trùng lặp bao gồm liên kết tới bản sao? –

Trả lời

167

Nếu bạn chỉ cần lấy mẫu mà không cần thay thế:

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

random.sample mất một dân số và kích thước k một mẫu và trả k thành viên ngẫu nhiên của dân số.

Nếu bạn phải kiểm soát đối với trường hợp nơi k lớn hơn len(population), bạn cần phải được chuẩn bị để đón một ValueError:

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

Sử dụng 'random.sample (xrange (1, 100), 3)' - với ** xrange ** thay vì phạm vi - tăng tốc mã rất nhiều, đặc biệt nếu bạn có phạm vi rộng, vì nó sẽ chỉ tạo theo yêu cầu 3 số cần thiết (hoặc nhiều hơn nếu lấy mẫu mà không cần thay thế), nhưng không phải toàn bộ phạm vi. Ví dụ: '% timeit random.sample (xrange (10000), 3)' = 4.92 µs trên mỗi vòng lặp, '% timeit random.sample (phạm vi (10000), 3)' = 126 µs trên mỗi vòng – gaborous

+12

Nếu bạn đang sử dụng Python2, vâng. Nếu bạn đang sử dụng Python 3 như trong câu trả lời của tôi nó đã làm điều này bởi vì xrange -> phạm vi trong Py3k. –

+0

Chúng ta có thể thay thế việc gọi 'random.sample()' bên trong khối 'try ... except', kiểm tra xem kích thước của mẫu (' 3' ở trên) nhỏ hơn hay bằng ('<=') so với kích thước của quần thể ('phạm vi (1, 2)' ở trên). – h4k1m

13

Tạo loạt các dữ liệu đầu tiên và sau đó xáo trộn nó như thế này

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

Bằng cách làm theo cách này, bạn sẽ nhận được tất cả các số trong phạm vi cụ thể nhưng theo một thứ tự ngẫu nhiên.

Nhưng bạn có thể sử dụng random.sample để có được số lượng các yếu tố mà bạn cần, từ một loạt các con số như thế này

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

Bạn có thể thêm vào một set cho đến khi bạn đạt n:

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

Hãy cẩn thận khi có phạm vi nhỏ hơn sẽ phù hợp với n. Nó sẽ lặp mãi mãi, không thể tìm thấy số mới để chèn lên đến n

+0

Nếu bạn sử dụng 'random.sample', nó sẽ ném một' ValueError' cho trường hợp đó (tất nhiên là bạn có thể bắt được). –

3

Bạn có thể sử dụng random.sample chức năng từ standard library để chọn k yếu tố từ dân:

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

trong trường hợp khá lớn loạt các con số có thể bạn có thể sử dụng itertools.islice với máy phát điện ngẫu nhiên vô hạn:

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 

CẬP NHẬT

Vì vậy, sau khi câu hỏi cập nhật nó bây giờ đã rõ ràng, rằng bạn cần n biệt số (duy nhất).

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) 
Các vấn đề liên quan