2012-07-26 16 views
18

Voglio generare numeri casuali nell'intervallo -1, 1 e voglio che ognuno abbia uguale probabilità di essere generato. Cioè Non voglio che gli estremi siano meno probabili. Qual è il modo migliore per fare questo?Qual è il modo migliore per ottenere numeri casuali in NumPy?

Finora, ho usato:

2 * numpy.random.rand() - 1 

e anche:

2 * numpy.random.random_sample() - 1 
+2

Hai avuto Qualche problema con l'approccio che hai usato? –

+0

@ Sven il problema è che non posso essere sicuro che gli estremi abbiano la stessa probabilità di essere scelti come tutte le altre possibilità. – wot

risposta

27

Il tuo approccio è bene. Un'alternativa è quella di utilizzare la funzione numpy.random.uniform():

>>> numpy.random.uniform(-1, 1, size=10) 
array([-0.92592953, -0.6045348 , -0.52860837, 0.00321798, 0.16050848, 
     -0.50421058, 0.06754615, 0.46329675, -0.40952318, 0.49804386]) 

per la probabilità per gli estremi: se sarebbe stato idealizzato, numeri casuali continue, la probabilità di ottenere uno degli estremi sarebbero 0. Dato che i numeri in virgola mobile sono una discretizzazione dei numeri reali continui, in realtà c'è qualche probabilità positiva di ottenere alcuni degli estremi. Questa è una forma di errore di discretizzazione, ed è quasi certo che questo errore verrà oscurato da altri errori nella tua simulazione. Smettila di preoccuparti!

+0

@wok: aggiunto un commento sugli estremi. –

+0

Grazie Sven. Proverò a smettere di preoccuparmi :-) ma facilmente detto che fatto. – wot

+0

Si noti che in entrambi i metodi l'intervallo è semiaperto, quindi il limite superiore verrà prodotto con probabilità 0. – ecatmur

2

Dalla documentazione per numpy.random.random_sample:

I risultati sono dalla distribuzione “continua divisa” sull'intervallo dichiarato. Per campionare Unif [a, b), b> un moltiplicare la produzione di random_sample da (b-a) e aggiungere a:

(b - a) * random_sample() + a 

risposta di Sven Per Marnach, la documentazione, probabilmente deve essere aggiornato per fare riferimento numpy.random.uniform.

+0

sì, è lì che ho controllato per primo. Grazie. – wot

3

Nota che numpy.random.rand permette di generare più campioni da una distribuzione uniforme a una chiamata:

>>> np.random.rand(5) 
array([ 0.69093485, 0.24590705, 0.02013208, 0.06921124, 0.73329277]) 

Consente inoltre di generare campioni in una data forma:

>>> np.random.rand(3,2) 
array([[ 0.14022471, 0.96360618], 
     [ 0.37601032, 0.25528411], 
     [ 0.49313049, 0.94909878]]) 

come lei ha detto, in modo uniforme numeri casuali distribuiti tra [-1, 1) possono essere generati con:

>>> 2 * np.random.rand(5) - 1 
array([ 0.86704088, -0.65406928, -0.02814943, 0.74080741, -0.14416581]) 
Problemi correlati