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?

Luge Mantis
la source
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
Yuri Stuken
la source
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 .

garnertb
la source
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.

Baurin Leza
la source
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 .

stwykd
la source