Comment obtenir un nombre aléatoire entre une plage flottante?


415

randrange(start, stop)prend uniquement des arguments entiers. Alors, comment pourrais-je obtenir un nombre aléatoire entre deux valeurs flottantes?


2
Si vous vouliez numpy c'est np.random.uniform(start, stop)ou np.random.uniform(start, stop, samples)si vous vouliez plusieurs échantillons. Sinon, les réponses ci-dessous sont les meilleures.
sachinruk

Réponses:


652

Utilisez random.uniform (a, b) :

>>> random.uniform(1.5, 1.9)
1.8733202628557872

4
cela pourrait-il théoriquement produire 1,5 et 1,9? ou ne produirait-il que 1,50 ~ 1 et 1,89 ~?
Musixauce3000

14
@ Musixauce3000 Réponse courte: Oui. Réponse plus longue: Si vous regardez la documentation, elle indique Returns a random floating point number N such that a <= N <= b for a <= b and b <= N <= a for b < aEn d'autres termes, la sortie Npeut être égale à l'entrée aet à b. Dans ce cas 1.5et 1.9.
Dan

Existe-t-il une autre façon de le faire sans utiliser la .uniformfonction, mais avec ou .randomou randrange?
DerryckDX

1
@DerryckDX 1.5 + random.random() * (1.9 - 1.5)devrait le faire, même si selon les spécifications cela ne reviendra jamais exactement 1.9(même en théorie).
Yonatan N

@ Musixauce3000 semble uniform(a, b)être implémenté comme a + (b-a) * random()et renvoie un nombre aléatoire dans la plage [a, b) ou [a, b] en fonction de l'arrondi github.com/python/cpython/blob/…
Pavel

74

random.uniform(a, b)semble être ce que vous cherchez. De la documentation:

Renvoie un nombre à virgule flottante aléatoire N tel que a <= N <= b pour a <= b et b <= N <= a pour b <a.

Voyez ici .


47

si vous voulez générer un flottant aléatoire avec N chiffres à droite du point, vous pouvez faire ceci:

round(random.uniform(1,2), N)

le deuxième argument est le nombre de décimales.


Je ne sais pas pourquoi cela n'a pas plus de votes positifs, les autres n'avaient pas le mécanisme d'arrondi.
TheTechRobo36414519

2

Le plus souvent, vous utiliseriez:

import random
random.uniform(a, b) # range [a, b) or [a, b] depending on floating-point rounding

Python fournit d' autres distributions si vous en avez besoin.

Si vous avez numpydéjà importé, vous pouvez utiliser son équivalent:

import numpy as np
np.random.uniform(a, b) # range [a, b)

Encore une fois, si vous avez besoin d'une autre distribution, numpyfournit les mêmes distributions que python, ainsi que de nombreuses autres .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.