Как подсчитать какой шанс выпадения числа в random.uniform?
Имеется простенький код который проверяет число на выпадение. но как мне узнать шанс, и сколько попыток нужно для этого выпадения?
import random
for x in range(9999999999999999999999999999999999999999999999999999999999):
r = str(random.uniform(0.0000001, 1))
if r[8] == '1' and r[7] == '0' and r[6] == '0' and r[5] == '0' and r[4] == '0' and r[3] == '0' and r[2] == '0' and r[1] == '.' and r[0] == '0':
print(r)
Ответы (2 шт):
Вопрос не столько о Python, сколько о том, как считать вероятности, при этом с неожиданным для кого-то выводом:-) (но на результат Python повлияет изрядно). Судя по вопросу, спрашивает школьник, кто это не проходил пока, тогда обойдемся без умных формул. Но для начала предлагаю совершенно непитоническую строку поменять на её нормальный эквивалент - легче понять, что хотим. Да и начальное условие тоже поменяем на более читаемое, так как явно речь идёт о бесконечном цикле.
Внимание: учитывая ответ @Stanislav Volodarskiy ниже, необходимо изменить желаемую последовательность для сравнения, чтобы совпадение было иногда. Например, на 1000001.
import random
while True:
r = str(random.uniform(0.0000001, 1))
# Первые два символа - всегда '0.' И вместо 0000001 поставлено 1000001.
if r[2:9] == '1000001':
print(r)
Итого, видим, что речь идет о совпадении всех 7 символов.
Шанс на совпадение одного - 1 к 10 (1 нуль после 1). Значит, вероятность совпадения всех семи - 1 к 10 000 000 (семь нулей после 1) - один к десяти миллионам.
Попыток надо усреднённо - тоже десять миллионов, но так как генератор случайный (условно, на самом деле - псевдослучайный), то может совпасть с первой попытки, а может не совпасть никогда (если у псевдослучайного генератора это число не выпадает в течение периода последовательности).
Теория
Условие сводится к тому что случайное число выглядит как: 0.0000001.... На месте точек могут быть любые цифры. Следовательно, по условию случайное число должно лежать в полуинтервале [0.0000001, 0.0000002).
Равномерный случайный генератор порождает числа в интервале [0.0000001, 1]. Из равномерности следует что вероятность печати числа равна отношению длин интервалов:
(0.0000002 - 0.0000001) / (1 - 0.0000001) ~= ~= 1.0000001 * 10^-7 (равенство примерное)
Так как нас интересует как часто мы будем получать такие числа, нам нужна обратная величина. Нужное число будет получаться в среднем через 9999999 попыток. Это точный результат.
Практика
Числа меньшие 0.0001 в Питоне преобразуются в строку в научном формате:
@>>> str(0.0001) '0.0001' @>>> str(0.00009) '9e-05'
А в научном формате на первой позиции не бывает нуля - порядок так подбирается чтобы первой цифрой была единица или больше. Поэтому вы никогда не дождётесь срабатывания условия.