Сказ о счастливых билетах

Safoyeth 22 Июл 2018

А давненько я не расчехлял питон! Всё как-то было не до творчества. Но, основательно так отдохнув в «нашем» Крыму (я обязательно напишу, почему Крым не наш, а именно «наш»), решил наваять сии строки я (привет Йода!). Дело в том, что в славном городе Евпатории есть старый-престарый трамвай с блэкджэком и кондукторами и теми самыми билетиками! Обидно, но за все поездки, коих набралось немало, нам так ни разу и не выпал тот самый счастливый билет, что и привело меня к вопросу о том, а какова вообще вероятность получить такой билет? Вот об этом я и расскажу.

На всякий случай для тех, кто в танке или просто очень юн. Счастливый билет тот, у которого сумма первой половины цифр совпадает с суммой второй половины. То есть

  • 777777 — 7 + 7 + 7 = 7 + 7 + 7
  • 123321 — 1 + 2 + 3 = 3 + 2 + 1
  • 629557 — 6 + 2 + 9 = 5 + 5 + 7

… и ещё сколько-то тысяч вариантов. Задача — найти все варианты и выяснить вероятность получения такого билетика.

Как правило билеты имеют номера от 000000 до 999999, что даёт нам один миллион вариантов. Возможно, где-то есть другие серии, поэтому метод, который я написал, можно применить и к другим — большим или меньшим, сериям. Собственно, сам метод:

Он довольно прост и делает ровно то, что нужно. Теперь можно выполнить print(list(lucky(0, 10**6-1))) и получить все-все-все номера счастливых билетов. А можно выполнить print(len(list(lucky(0, 10**6-1)))) и узнать, что всего есть 55252 таких билета.

Наш алгоритм никак не оптимизирован, строго говоря, он и не алгоритм вовсе, но всё, что нужно, он находит. Если очень хочется, то можно посчитать и процент счастливых билетов — 5,53%. Теперь, покупая билет, я точно знаю, что вероятность получить счастливый билет — 5,53%. Однако, есть ещё интересный момент! Дело в том, что у контролёра обычно с собой моток билетов чуть-чуть меньше, чем от 000000 до 999999. Сколько точно неясно (ну не стал я мучить человека таким вопросом), но для красоты давайте считать, что в мотке 100000 билетов. То есть от 000000 до 099999, от 100000 до 199999 или от 900000 до 999999. Ну как-то так. Следующий вопрос возникает автоматически — а как ведёт себя вероятность выпадения счастливого билета в зависимости от номеров? Если сразу попытаться дать ответ, то первое, что приходит на ум — не зависит, но если дать себе труд подумать, то можно предположить, что вероятность будет разной.

Цифры красивы, поэтому написав print([len(list(lucky(x, x+100000))) for x in range(0, 1000000, 100000)] ), я получил очень симпатичный ответ. А именно — [4840, 5280, 5631, 5875, 6000, 6000, 5875, 5631, 5280, 4840] В общем, то это логично и красиво, чем «среднее» первая цифра, тем больше вариантов, чем цифра меньше, или наоборот больше, тем вариантов меньше. Даже мне, человеку, который далёк от математических вершин (да что там вершин, от основ!) это напомнило кое-что. А именно — нормальный закон распределения. В доказательство, ещё немного кода:

И перед нами он — нормальный закон распределения! Ну или вот так, чтобы было понятно (Что-то я никак не смог заставить wordpress дружить с \TeX):

Из всего этого наглядно видно, что наибольший шанс у билетов, которые начинаются на 4 и 5 — 6%, выше среднего по всем всей выборке, ниже — у билетов с 3 и 6, ещё ниже у 2 и 7, ещё ниже у 1 и 8, и, наконец, самый низкий шанс у билетов, начинающихся с 0 и 9.

Всем счастья и не только с билетами!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.




Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: