2012-11-29 16 views
13

Eventuali duplicati:
pick N items at randomCome generare numeri casuali diversi?

ho bisogno di generare 6 numeri casuali tra 1 e 49, ma non possono essere la stessa. So come renderli casuali, ma non sono sicuro di come far sì che siano diversi.

Il foglio di lavoro raccomanda la visualizzazione di ogni numero e l'impostazione a zero, ma non vedo come sarebbe d'aiuto.

Qualsiasi consiglio è molto apprezzato.

+4

Si consiglia di inviare quello che hai provato. – asheeshr

+0

Ti rendi conto, naturalmente, che se non possono essere gli stessi, per definizione, non sono più davvero casuali. –

+0

Sì, sono ancora casuali, solo che stanno tirato da un elenco leggermente più piccolo. – keirbtre

risposta

13

Un set non mancherà di tenere i duplicati:

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

È possibile utilizzare random.sample:

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

"Il foglio di lavoro raccomanda la visualizzazione di ogni numero e l'impostazione a zero, ma non vedo come ciò sarebbe d'aiuto. "

assumendo questo è un incarico ed è necessario implementare il campionamento da soli, si potrebbe take a look at how random.sample is implemented. È davvero informativo, ma potrebbe essere troppo complicato per le tue esigenze poiché il codice garantisce anche che tutte le sottosezioni siano anche un campione casuale valido. Per efficienza, utilizza anche approcci diversi a seconda delle dimensioni della popolazione.

Per quanto riguarda il foglio di lavoro, ritengo che si stia iniziando con un elenco di numeri da 1 a 49 e suggerisce di sostituire i numeri selezionati con 0 in modo da poterli saltare se riselezionati. Ecco alcuni pseudo codice per iniziare:

 
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 

Se desiderate provare qualcosa di diverso, ci sono molti altri approcci da considerare per esempio randomizzare la lista troncando, o qualche forma di reservoir sampling.

Buona fortuna con la vostra assegnazione.

+2

Se si utilizza Python 3, cambiare 'xrange' in' range'. –

+0

Grazie mille! Fa parte di un incarico. Sei stato molto utile :) – keirbtre

+0

Prego. –

3

E 'una domanda molto comune e interviste stupide, qui è la sua soluzione/algoritmo:

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

Per le persone a cuore l'efficienza qui è il banco di prova della mia soluzione e Chin di:

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

I risultati:

>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 

risolti per essere allo stesso tempo!