2012-11-29 6 views
13

thể trùng lặp:
pick N items at randomCách tạo số ngẫu nhiên khác nhau?

tôi cần phải tạo ra 6 số ngẫu nhiên từ 1 đến 49 tuổi, nhưng họ không thể được như vậy. Tôi biết làm thế nào để làm cho họ ngẫu nhiên, tôi chỉ không chắc chắn làm thế nào để đảm bảo rằng họ là khác nhau.

Trang tính đề xuất hiển thị từng số và đặt thành số không, nhưng tôi không thấy cách điều đó sẽ hữu ích.

Bất kỳ lời khuyên nào được đánh giá cao.

+4

Bạn nên đăng những gì bạn đã thử. – asheeshr

+0

Bạn nhận ra tất nhiên là nếu chúng không thể giống nhau, theo định nghĩa chúng không còn thực sự ngẫu nhiên nữa. –

+0

Có, chúng vẫn ngẫu nhiên, chỉ là chúng được kéo từ một danh sách nhỏ hơn một chút. – keirbtre

Trả lời

13

Một set sẽ không giữ bất kỳ bản sao:

s = set() 
while len(s) < 6: 
    s.add(get_my_new_random_number()) 
36

Bạn có thể sử dụng random.sample:

>>> random.sample(xrange(1,50), 6) 
[26, 39, 36, 46, 37, 1] 

"Các bảng khuyến cáo hiển thị mỗi số và đặt nó vào không, nhưng tôi không thấy điều đó sẽ giúp ích gì. "

Giả sử đây là nhiệm vụ và bạn cần tự mình thực hiện lấy mẫu, bạn có thể take a look at how random.sample is implemented. Nó thực sự mang tính thông tin, nhưng có thể quá phức tạp đối với nhu cầu của bạn vì mã cũng đảm bảo rằng tất cả các lát phụ cũng sẽ là mẫu ngẫu nhiên hợp lệ. Để đạt hiệu quả, nó cũng sử dụng các cách tiếp cận khác nhau tùy thuộc vào quy mô dân số. Đối với trang tính, tôi tin rằng bạn giả sử bạn đang bắt đầu với một danh sách các số từ 1 đến 49 và gợi ý rằng bạn thay thế các số bạn đã chọn bằng 0 để có thể bỏ qua nếu được chọn lại. Dưới đây là một số mã giả để giúp bạn bắt đầu:

 
population = range(1, 50) # list of numbers from 1 to 49 
sample = [] 
until we get 6 samples: 
    index = a random number from 0 to 48 # look up random.randint() 
    if population[index] is not 0: # if we found an unmarked value 
    append population[index] to sample 
    set population[index] = 0 # mark selected 

Nếu bạn muốn thử một cái gì đó khác nhau, có rất nhiều cách tiếp cận khác để xem xét ví dụ ngẫu nhiên danh sách sau đó cắt xén, hoặc một số hình thức reservoir sampling.

Chúc bạn may mắn với nhiệm vụ của mình.

+2

Nếu sử dụng Python 3, thay đổi 'xrange' thành' dải ô'. –

+0

Cảm ơn bạn rất nhiều! Nó thực sự là một phần của một bài tập. Bạn đã rất hữu ích :) – keirbtre

+0

Bạn được chào đón. –

3

Đó là một câu hỏi rất phổ biến và các cuộc phỏng vấn ngu ngốc, đây là giải pháp của nó/thuật toán:

import random 
a = range(1,50) 
for i in xrange(6): 
    b = a[random.randint(0,len(a)-i)] 
    a.remove(b) 
    print b 

Đối với những người quan tâm đến hiệu quả ở đây là băng ghế dự bị kiểm tra dung dịch của tôi và Chin:

>>> random.sample(xrange(1,50), 6) 
[26, 39, 36, 46, 37, 1] 

Kết quả:

>python -mtimeit -s'import try2' 
[38, 7, 31, 24, 30, 32] 
100000000 loops, best of 3: 0.0144 usec per loop 
>python -mtimeit -s'import try1' 
36 
26 
41 
31 
37 
14 
100000000 loops, best of 3: 0.0144 usec per loop 

giải quyết được cùng một lúc!