2010-02-01 23 views

Respuesta

19

Docs son aquí: http://docs.python.org/library/random.html

... aleatorio(), que genera un flotador aleatorio uniformemente en la gama semi-abierto [0.0, 1.0).

Por lo tanto, el valor de retorno será mayor o igual que 0 y menor que 1.0.

+8

Para obtener una explicación de la notación de rango de paréntesis/matriz, mira aquí: http: //en.wikipedia. org/wiki/Interval_ (mathematics) #Terminology –

+1

Creo que el sistema de ayuda interno de Python (como se menciona en otra respuesta) es mucho más accesible cuando se programa en Python. 'help (random.random)' hubiera dado al OP la información que necesitaba. – Omnifarious

+0

Es mucho mejor vincular a la documentación real cuando escribe en una página web. –

10

La función random.random de Python devuelve números que son menores, pero no iguales a, 1.

Sin embargo, puede devolver 0.

+1

aleatorio() -> x en el intervalo [0, 1) Es decir, incluyendo 0. – telliott99

+4

@ telliott99: Eso es (casi) exactamente lo que dije. – SLaks

+1

+1 por ser la única respuesta para no confiar en la notación matemática de ciencia ficción. –

32
>>> help(random.random) 
Help on built-in function random: 

random(...) 
    random() -> x in the interval [0, 1). 

Eso significa que 1 está excluido.

+9

Me gusta su respuesta mejor. Python tiene un fantástico sistema de ayuda interna y las personas deben ser alentadas a usarlo. – Omnifarious

11

Las otras respuestas ya aclararon que 1 no está incluido en el rango, pero por curiosidad, decidí mirar la fuente para ver exactamente cómo se calcula.

fuente El CPython se puede encontrar here

/* random_random is the function named genrand_res53 in the original code; 
* generates a random number on [0,1) with 53-bit resolution; note that 
* 9007199254740992 == 2**53; I assume they're spelling "/2**53" as 
* multiply-by-reciprocal in the (likely vain) hope that the compiler will 
* optimize the division away at compile-time. 67108864 is 2**26. In 
* effect, a contains 27 random bits shifted left 26, and b fills in the 
* lower 26 bits of the 53-bit numerator. 
* The orginal code credited Isaku Wada for this algorithm, 2002/01/09. 
*/ 
static PyObject * 
random_random(RandomObject *self) 
{ 
    unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6; 
    return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0)); 
} 

Así que la función genera eficazmente m/2^53 donde 0 <= m < 2^53 es un número entero. Como los flotadores tienen 53 bits de precisión normalmente, esto significa que en el rango [1/2, 1), se generan todos los flotantes posibles. Para valores más cercanos a 0, omite algunos valores flotantes posibles para la eficiencia pero los números generados se distribuyen uniformemente dentro del rango. El mayor número posible generado por random.random es precisamente

0,99999999999999988897769753748434595763683319091796875

+1

+1 ¡Para el flotador más grande posible! –

+1

Si el código C anterior se compila con una constante de precisión única, esto podría producir 1.0. Ver mi respuesta para más detalles –

2

A partir del código en las respuestas de antimonio es fácil ver que random.random() no vuelve exactamente 1.0 en plataformas que tienen al menos 53 bits de mantisa para los cálculos implicando constantes no anotadas con 'f' en C. Esa es la precisión que IEEE 754 prescribe y es estándar en la actualidad.

Sin embargo, en plataformas con menor precisión, por ejemplo, si Python se compila con una constante de precisión única para usar en una plataforma incrustada, al agregar b a * 67108864.0 se puede redondear hasta 2^53 si b es lo suficientemente cerca de 2^26 y esto significaría que se devuelve 1.0. Tenga en cuenta que esto sucede independientemente de la precisión que utilice la función PyFloat_FromDouble de Python.

Una forma de comprobar esto sería comprobar unos pocos cientos de números aleatorios, ya sea que el bit 53 sea cada vez 1. Si es 1 al menos una vez, esta prueba tiene suficiente precisión y usted está bien. De lo contrario, el redondeo es la explicación más probable, lo que significa que random.random() puede devolver 1.0. Por supuesto, es posible que tengas mala suerte. Puede aumentar la certeza tan alto como desee probando más números.

Cuestiones relacionadas