¿Cuál es la mejor manera de obtener números aleatorios en NumPy?

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 surgir. Cual es la mejor manera de hacer esto?

Hasta ahora, he utilizado:

 2 * numpy.random.rand() - 1 

y también:

 2 * numpy.random.random_sample() - 1 

Su enfoque está bien. Una alternativa es usar 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]) 

Con respecto a la probabilidad de los extremos: si fuera idealizado, números aleatorios continuos, la probabilidad de obtener uno de los extremos sería 0. Dado 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 será enano por otros errores en su simulación. ¡Deja de preocuparte!

Tenga en cuenta que numpy.random.rand permite generar múltiples muestras a partir 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 usted dijo, los números aleatorios distribuidos uniformemente entre [-1, 1) se pueden generar con:

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

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

Los resultados son de la distribución “uniforme continua” en el intervalo establecido. Para muestrear Unif [A, b), b> a multiplica la salida de random_sample por (ba) y agrega a :

  (b - a) * random_sample() + a 

Según la respuesta de Sven Marnach, la documentación probablemente deba actualizarse para hacer referencia a numpy.random.uniform .