Как получить случайное число между диапазонами с плавающей точкой?

416

randrange(start, stop)принимает только целочисленные аргументы. Так как же получить случайное число между двумя значениями с плавающей запятой?

Богомол тобогган
источник
2
Если вы хотели NumPy это np.random.uniform(start, stop)или np.random.uniform(start, stop, samples)если вы хотели несколько образцов. В противном случае ниже ответы являются лучшими.
sachinruk

Ответы:

653

Используйте random.uniform (a, b) :

>>> random.uniform(1.5, 1.9)
1.8733202628557872
Юрий Стукен
источник
4
может ли это теоретически произвести 1,5 и 1,9? или это только когда-нибудь даст 1.50 ~ 1 и 1.89 ~?
Musixauce3000
14
@ Musixauce3000 Короткий ответ: Да. Более длинный ответ: если вы посмотрите на документацию, в которой говорится: Returns a random floating point number N such that a <= N <= b for a <= b and b <= N <= a for b < aдругими словами, выход Nможет совпадать с входным значением aи b. В этом случае 1.5и 1.9.
Дан
Есть ли другой способ сделать это без использования .uniformфункции, но с помощью либо .randomили randrange?
DerryckDX
1
@DerryckDX 1.5 + random.random() * (1.9 - 1.5)должен это делать, даже если согласно спецификациям это никогда не вернется точно 1.9(даже теоретически).
Йонатан N
@ Musixauce3000, кажется uniform(a, b), реализован как a + (b-a) * random()и возвращает случайное число в диапазоне [a, b) или [a, b] в зависимости от округления github.com/python/cpython/blob/…
Павел
74

random.uniform(a, b)кажется, что вы ищете. Из документов:

Вернуть случайное число с плавающей точкой N, такое что a <= N <= b для a <= b и b <= N <= a для b <a.

Смотрите здесь .

garnertb
источник
47

если вы хотите сгенерировать случайное число с N цифрами справа от точки, вы можете сделать это:

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

Второй аргумент - это количество десятичных знаков.

Баурин Леза
источник
Я не знаю, почему у этого нет большего количества голосов, у других не было механизма округления.
TheTechRobo36414519
2

Чаще всего вы используете:

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

Python предоставляет другие дистрибутивы, если вам нужно.

Если вы уже numpyимпортировали, вы можете использовать его эквивалент:

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

Опять же, если вам нужен другой дистрибутив, numpyпредоставляет те же дистрибутивы, что и для Python, а также множество дополнительных .

stwykd
источник