2015-12-20 1 views
0

Quelle est la précision de la fonction random() de Python?Petites probabilités en Python

On suppose que je voudrais prendre une décision basée sur un coin flip de probabilité 1/234276901, puis-je utiliser une déclaration

if random() < 1./234276901: 

?

Quelle serait la précision d'une telle déclaration? (en termes de probabilité réelle le si sera pris).

Existe-t-il un moyen plus précis (mais fonctionnant dans un délai raisonnable) pour obtenir de tels retournements de pièces?

+1

Le flottant a des limites définies. Utilisez 'random.randint()' (uniquement en Python 3) si vous avez besoin d'un grand nombre d'états différents. –

+0

Que voulez-vous dire par précision? Et vous n'utiliserez sûrement pas cela puisque random retourne quelque chose entre 0 et 1, donc ce serait toujours vrai. –

+0

@ MartijnPieters - vous avez évidemment raison, je l'ai écrit dans une hâte depuis que je devais partir. J'ai édité, merci. –

Répondre

1

random.random() produit une valeur flottante dans l'intervalle [0,0, 1,0) (ce qui signifie que 0.0 est inclus dans les valeurs possibles, mais 1.0 n'est pas).

Les nombres à virgule flottante ont une précision de 53 bits, vous obtenez donc 2 ** 53 "étapes" différentes entre 0.0 et 1.0. 53 bits est beaucoup de précision pour représenter 1/234276901, qui n'a besoin que d'environ 28 bits:

>>> 234276901 .bit_length() 
28 

Alors oui, en utilisant random.random() < 1/234276901 fonctionnera, il y a beaucoup de précision reste. `Random()` retourne un * float * dans la plage [0.0 et 1.0), et non un nombre entier.

+0

Merci Martijn. Petite correction: plage -> [0.0, 1.0) et non [0.0, 0.1). –

+0

@RB: oui, c'est une faute de frappe. –

0

Si vous voulez obtenir un coin flip de 1/234276901, utilisez random.random() comme ceci:

>>> floor(random.random() * 234276901) 

depuis random() donne des valeurs réelles entre 0 et 1, il faut multiplier par votre maximum pour étirer l'intervalle que l'arrondi des valeurs pour les convertir en entiers.


Vous pouvez également utiliser random.randint():

>>> random.randint(1,234276901)