¿Alguna vez el random.random() de python devuelve 1.0 o solo regresa hasta el 0.9999 ..?Rango de random.random de python() de la biblioteca estándar
Respuesta
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.
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 –
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
Es mucho mejor vincular a la documentación real cuando escribe en una página web. –
La función random.random
de Python devuelve números que son menores, pero no iguales a, 1
.
Sin embargo, puede devolver 0
.
aleatorio() -> x en el intervalo [0, 1) Es decir, incluyendo 0. – telliott99
@ telliott99: Eso es (casi) exactamente lo que dije. – SLaks
+1 por ser la única respuesta para no confiar en la notación matemática de ciencia ficción. –
>>> help(random.random)
Help on built-in function random:
random(...)
random() -> x in the interval [0, 1).
Eso significa que 1 está excluido.
Me gusta su respuesta mejor. Python tiene un fantástico sistema de ayuda interna y las personas deben ser alentadas a usarlo. – Omnifarious
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 ¡Para el flotador más grande posible! –
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 –
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.
- 1. ¿IronPython implementa la biblioteca estándar de Python?
- 2. ¿La biblioteca estándar de Python es realmente estándar?
- 3. ¿Python tiene decoradores en la biblioteca estándar?
- 4. Diferencias entre numpy.random y random.random en Python
- 5. Objeto parecido a JavaScript en la biblioteca estándar de Python?
- 6. mod_wsgi python no puede importar de la biblioteca estándar
- 7. ¿Documentación estándar de la biblioteca SBCL?
- 8. Etiquetas de biblioteca estándar
- 9. versiones de la biblioteca estándar de C++
- 10. ¿Dónde encuentro el código de biblioteca estándar de Python?
- 11. ¿Cuál es la diferencia entre la biblioteca estándar y la biblioteca de plantillas estándar?
- 12. Trabajo interno de la biblioteca estándar C
- 13. Versión imprimible de la biblioteca estándar Haskell
- 14. Incluir biblioteca estándar de C++
- 15. Localización de C biblioteca estándar
- 16. Estabilizando la biblioteca estándar qsort?
- 17. Función de rango Python
- 18. Motivo de las bajas clasificaciones de Pylint del código de la biblioteca estándar de Python
- 19. pylint no reconoce parte de la biblioteca estándar
- 20. Forzar módulo de importación desde la biblioteca estándar de Python en lugar de PYTHONPATH predeterminado
- 21. Lista de excepciones de la biblioteca estándar de C++?
- 22. Cross Browser Selection ¿Biblioteca de rango?
- 23. Agregar un atributo a un diccionario de Python de la biblioteca estándar
- 24. Matriz Biblioteca estándar
- 25. Ruta de la biblioteca Python
- 26. MacPorts Clang 3.1 ¿Falta la instalación de la Biblioteca estándar?
- 27. biblioteca estándar `tipo FILE`
- 28. Biblioteca estándar Intel (C++)
- 29. C++ 0x biblioteca estándar manual de referencia
- 30. declaración de C Biblioteca señal estándar
Hay oro en ellos thar hills. 42 puntos (y contando) para una pregunta sobre qué devuelve random.random(). –
telliott99
Observe si no termina su secuencia 0.9999 en realidad es igual a 1.0. –