Plage de random.random () de python dans la bibliothèque standard
Python est aléatoire.random() retourne jamais 1.0 ou il ne fait que retourner jusqu'à 0.9999..?
source d'informationauteur daniels | 2010-02-01
Vous devez vous connecter pour publier un commentaire.
Docs sont ici: http://docs.python.org/library/random.html
Donc, la valeur de retour sera supérieur ou égal à 0 et inférieur à 1.0.
Cela signifie que 1 est exclue.
Autres réponses déjà précisé que 1 n'est pas inclus dans la gamme, mais par curiosité, j'ai décidé de regarder à la source afin de voir précisément comment il est calculé.
Le Disponible source peut être trouvé ici
Donc la fonction génère effectivement
m/2^53
où0 <= m < 2^53
est un entier. Depuis flotteurs ont 53 bits de précision normalement, cela signifie que sur l'intervalle [1/2, 1), chaque flotteur est généré. Pour les valeurs proches de 0, il saute quelques valeurs flottantes pour plus d'efficacité, mais les nombres générés sont distribués de manière uniforme au sein de la gamme. Le plus grand nombre possible généré parrandom.random
est précisément0.99999999999999988897769753748434595763683319091796875
Python
aléatoire.random
fonction renvoie les nombres inférieurs, mais pas égal à,1
.Cependant, il peut renvoyer
0
.Du code de l'Antimoine dans les réponses, il est facile de voir que hasard.random() ne retourne jamais exactement 1.0 sur les plates-formes qui ont au moins 53 bits de mantisse pour les calculs impliquant des constantes non annoté avec 'f' en C. C'est la précision IEEE 754 prescrit et est la norme aujourd'hui.
Cependant, sur les plates-formes avec précision inférieure, par exemple si Python est compilé avec-fsingle-précision constante pour une utilisation sur une plate-forme intégrée, l'ajout de b à a*67108864.0 peut entraîner la arrondissement à 2^53 si b est assez proche de 2^26 et cela signifie que 1.0 est retourné. Notez que cela se produit indépendamment de la précision que Python PyFloat_FromDouble fonction utilise.
Un moyen de tester ce serait à vérifier quelques centaines de nombres aléatoires si la 53e bit est toujours 1. Si il est à 1, au moins une fois cette preuves suffisamment de précision et vous êtes bien. Si ce n'est, arrondissement est l'explication la plus probable de sens que hasard.random() peut retourner 1.0. Il est bien sûr possible que vous avez été juste malchanceux. Vous pouvez pousser la certitude aussi haut que vous le voulez en tester d'autres numéros.