2012-07-26 10 views
18

Quiero generar números aleatorios en el rango -1, 1 y quiero que cada uno tenga la misma probabilidad de ser generado. Es decir. No quiero que los extremos sean menos propensos a aparecer. Cual es la mejor manera de hacer esto?¿Cuál es la mejor manera de obtener números aleatorios en NumPy?

Hasta ahora, he utilizado:

2 * numpy.random.rand() - 1 

y también:

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

¿Tiene usted ¿Algún problema con el enfoque que usaste? –

+0

@ Sven el problema es que no puedo estar seguro de que los extremos sean tan elegibles como todas las otras posibilidades. – wot

Respuesta

27

Su enfoque está muy bien. Una alternativa es utilizar la función 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]) 

En cuanto a la probabilidad de que los extremos: si sería idealizado, números aleatorios continuos, la probabilidad de conseguir uno de los extremos serían 0. Puesto que los números de punto flotante son una discretización de los números reales continuos, en realidad hay alguna probabilidad positiva de obtener algunos de los extremos. Esta es una forma de error de discretización, y es casi seguro que este error se verá afectado por otros errores en su simulación. ¡Deja de preocuparte!

+0

@wok: Agregó un comentario sobre los extremos. –

+0

Gracias Sven. Trataré de dejar de preocuparme :-) pero es más fácil decirlo que hacerlo. – wot

+0

Tenga en cuenta que en ambos métodos el intervalo es medio abierto, por lo que el límite superior se producirá con la probabilidad 0. – ecatmur

2

De la documentación de numpy.random.random_sample:

Los resultados corresponden a la distribución “uniforme continua” en el intervalo indicado. Para muestra Unif [a, b), b> a multiplicar la salida del random_sample por (b-a) y añadir a:

(b - a) * random_sample() + a 

respuesta de por Sven Marnach, la documentación probablemente necesita una reforma para hacer referencia numpy.random.uniform.

+0

sí, ahí es donde lo verifiqué primero. Gracias. – wot

3

Nota que numpy.random.rand permite generar múltiples muestras de una distribución uniforme en una llamada:

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

También permite generar muestras en una forma dada:

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

como ha dicho, de manera uniforme números aleatorios distribuidos entre [-1, 1] se pueden generar con:

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