2012-11-29 12 views
13

Powiel możliwe:
pick N items at randomJak generować losowe liczby, które są różne?

muszę wygenerować 6 liczb losowych między 1 a 49, ale nie mogą być takie same. Wiem, jak zrobić, żeby były przypadkowe, po prostu nie jestem pewien, jak zapewnić, że są różne.

Arkusz roboczy zaleca wyświetlenie każdego numeru i ustawienie go na zero, ale nie widzę, w jaki sposób to pomoże.

Każda rada jest bardzo doceniana.

+4

Powinieneś opublikować to, czego próbujesz. – asheeshr

+0

Zdajesz sobie sprawę, oczywiście, że jeśli nie mogą być takie same, z definicji nie są już przypadkowe. –

+0

Tak, nadal są losowe, tylko dlatego, że są pobierane z nieco mniejszej listy. – keirbtre

Odpowiedz

13

set nie zachowa żadnych duplikatów:

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

Można użyć random.sample:

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

„Arkusz zaleca wyświetlanie każdy numer i ustawienie go do zera, ale nie rozumiem, w jaki sposób to pomoże. "

Zakładając, że jest to zadanie i trzeba wdrożyć próbkowanie siebie, można take a look at how random.sample is implemented. Jest to bardzo pouczające, ale może być zbyt skomplikowane dla twoich potrzeb, ponieważ kod zapewnia również, że wszystkie podsegmenty będą również prawidłową próbką losową. Ze względu na efektywność stosuje różne podejścia w zależności od wielkości populacji.

Jeśli chodzi o arkusz kalkulacyjny, to zakładam, że zaczynasz od listy liczb od 1 do 49 i sugeruje, aby zastąpić wybrane liczby cyframi 0, aby można było je pominąć, jeśli zostaną ponownie wybrane. Oto niektóre pseudo kod, aby dostać się zaczęło:

 
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 

Jeśli chcesz spróbować czegoś innego, istnieje wiele innych podejść do rozważenia np randomizację listy, a następnie obcięcie lub inną formę reservoir sampling.

Powodzenia z przydziału.

+2

Jeśli używasz Pythona 3, zmień 'xrange' na' range'. –

+0

Dziękuję bardzo! Jest to rzeczywiście część zadania. Byłeś bardzo pomocny :) – keirbtre

+0

Nie ma za co. –

3

Jest to bardzo powszechny i ​​głupie wywiady pytanie, tutaj jest jego rozwiązanie/algorytm:

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

Dla ludzi dbał o wydajności oto ławka test mojego rozwiązania i Chin na:

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

wyniki:

>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 

postanowił być w tym samym czasie!

Powiązane problemy