В документации сказано, что есть шанс, что uniform(0,1)
можно сгенерировать значения 0
и 1
.
Я бегал uniform(0, 1)
10000 раз, но он никогда не выдавал ноль. Даже в случае uniform(0, 0.001)
.
Может random.uniform(0,1)
когда-нибудь генерировать 0
или 1
?
python
random
uniform-distribution
Венкатеш Ганди
источник
источник
X ~ U(0,1)
, тоP(X=x)
это почти наверняка 0, для всех значений х. (Это потому, что в интервале бесконечно много возможных значений.) Если вы ищете ровно 0 или 1, вам следует использовать другую функциюrandom.choice
random.uniform
?Math.random()
работает в JavaScript).random.uniform(0, 1)
возвращает 0 при первом вызовеОтветы:
uniform(0, 1)
может производить0
, но никогда не даст1
.Документация говорит вам , что конечная точка
b
может быть включена в значениях , полученных:Таким образом
uniform(0, 1)
, формула0 + (1-0) * random()
, упрощенная до1 * random()
, должна была бы быть способной производить1
точно. Это произойдет, только еслиrandom.random()
1.0exactly. However,
random ()*never* produces
1.0`.Цитирование
random.random()
документации :Обозначение
[..., ...)
означает, что первое значение является частью всех возможных значений, а второе - нет.random.random()
будет в большинстве случаев производить значения очень близко к1.0
.float
Тип Python - это значение с плавающей точкой IEEE 754 base64 , которое кодирует число двоичных дробей (1/2, 1/4, 1/5 и т. Д.), Составляющих значение, а полученное значениеrandom.random()
представляет собой просто сумму случайный выбор этих 53 таких фракций от2 ** -1
(1/2) до2 ** -53
(1/9007199254740992).Однако, поскольку он может давать очень близкие значения
1.0
, а также ошибки округления, возникающие при умножении чисел с плавающей запятой, вы можете получитьb
для некоторых значенийa
иb
. Но0
и1
не входят в число этих ценностей.Обратите внимание, что
random.random()
может выдавать 0.0, поэтомуa
всегда включается в возможные значения дляrandom.uniform()
(a + (b - a) * 0 == a
). Поскольку существуют2 ** 53
различные значения, которыеrandom.random()
могут быть получены (все возможные комбинации этих 53 двоичных дробей), существует только 12 ** 53
(так что 1 в 9007199254740992) вероятность того, что это когда-либо произойдет.Итак, максимально возможная ценность, которую
random.random()
можно произвести, это1 - (2 ** -53)
; просто выберите достаточно маленькое значение для того,b - a
чтобы округление включалось при умножении на более высокиеrandom.random()
значения. Чем меньшеb - a
, тем больше шансов на это:Если вы нажмете
b = 0.0
, то мы делим 1023 раза, указанное выше значение означает, что нам повезло после 1019 делений. Наибольшее значение, которое я нашел до сих пор (выполнение вышеуказанной функции в цикле сmax()
), составляет8.095e-320
(1008 делений), но, вероятно, существуют более высокие значения. Это все азартная игра. :-)Это также может произойти, если между
a
и не слишком много дискретных шаговb
, например, когдаa
иb
имеют высокий показатель степени, и поэтому может показаться, что они далеко впереди. Значения с плавающей запятой по-прежнему являются только приблизительными, и число значений, которые они могут кодировать, конечно. Например, существует только одна двоичная дробь разница междуsys.float_info.max
иsys.float_info.max - (2 ** 970)
, таким образом есть шанс , 50-50random.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)
производитsys.float_info.max
:источник
«Несколько раз» недостаточно. 10000 не достаточно.
random.uniform
выбирает из 2 ^ 53 (9,007,199,254,740,992) различных значений. Вы заинтересованы в двух из них. Таким образом, вы должны ожидать генерирования нескольких квадриллионов случайных значений, прежде чем получите значение, которое в точности равно 0 или 1. Таким образом, это возможно, но очень вероятно, что вы никогда не будете наблюдать это.источник
uniform(0, 1)
это невозможно производить1
как результат. Это потому, что функция просто определяется какdef uniform(a, b): return a + (b - a) * random()
иrandom()
никогда не может производить1.0
.Вы можете попытаться сгенерировать цикл, который подсчитывает количество итераций, необходимое для точного отображения 0 (не).
Кроме того, как заявил Хоббс, количество
uniformly
выборочных значений составляет 9 007 199 254 740 992. Это означает, что вероятность увидеть 0 в точности равна 1 / 9,007,199,254,740,992. Что в общих чертах и округлении означает, что вам понадобится в среднем 10 кватриллионов образцов, чтобы найти 0. Конечно, вы можете найти его в своих первых 10 попытках или никогда.Выборка 1 невозможна, так как интервал, определенный для значений, закрыт круглыми скобками, следовательно, не включая 1.
источник
Конечно. Вы уже были на правильном пути, пытаясь
uniform(0, 0.001)
вместо этого. Просто продолжайте ограничивать границы достаточно, чтобы это произошло раньше.источник