- Способы выбора своих чисел
- Не мы выбираем числа, а числа выбирают нас
- Выбор случайных чисел: это сложнее, чем вы думаете
- Что такое случайность и зачем она нам нужна?
- Человеческий мозг – плохой генератор случайных чисел
- Случайности настолько сложно добиться, что мы редко ее используем
- Псевдослучайность
- Заключение
- Подробно о генераторах случайных и псевдослучайных чисел
- Введение
- Как отличить случайную последовательность чисел от неслучайной?
- Чуть более сложный пример или число Пи
- Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)
- Уязвимости ГПСЧ
- Линейный конгруэнтный ГПСЧ (LCPRNG)
- Предсказание результатов линейно-конгруэнтного метода
- Взлом встроенного генератора случайных чисел в Java
- Взлом ГПСЧ Mersenne twister в PHP
- Область для взлома
- Задание распределения для генератора псевдослучайных чисел
- Экспоненциальное распределение
- Тесты ГПСЧ
Способы выбора своих чисел
Не мы выбираем числа, а числа выбирают нас
Конечно с данным утверждением (предположением) можно поспорить, как можно и привести множество примеров в защиту. Самым ярким примером того, что на самом деле, именно числа выбирают нас, можно считать дату рождения любого человека. Многие вещи можно изменить по ходу нашей жизни, и даже собственное имя, что к стати по утверждению психологов, астрологов и нумерологов, сильно влияет на судьбу человека. Но, числа из даты собственного дня рождения изменить нельзя! Трудно поспорить с тем, что не мы выбрали эти числа.
Так же трудно поспорить с тем, что немало джекпотов сорваны благодаря выбору лотерейной комбинации при помощи режима «АВТО» на игровом билете вашей лотереи, что так же можно принять за факт того, что именно эти числа выбрали человека. Если пока нет возможности вычислить, или найти какую либо закономерность, думаю есть смысл пересмотреть свои взгляды на способы выбора чисел для составления лотерейных комбинаций. И я согласен с теми игроками, которые уверенны что выигрыш в лотерею это чистая случайность. Вот только на мой взгляд, не стоит доверять выбор своей комбинации, пусть и случайным образом, компьютеру.
Как же определить, какие числа выбрали вас сегодня? Если игрок не пользуется анализом прошедших тиражей, не использует программы для лотерей, как он выбирает числа?
Черкая наугад, это только так кажется, что наугад. На самом деле, и тут прослеживается закономерность. Уж так устроен человек…. Числа на билете расположены в виде последовательной таблицы, одни игроки стараются разнести все числа на игровом поле, как можно дальше друг от друга, избегая выбора 2−3-х чисел рядом (по диагонали, вертикали, горизонтали). Другие наоборот зачеркивают, вырисовывая причудливые фигуры из зачеркнутых чисел. Так же, многие интуитивно выбирают числа связанные с датами рождения в диапазоне от 1 до 31 (31 день в месяце). Короче, трудно освободится от всех предрассудков и точно определить, какие числа выбрали вас сегодня.
Предлагаю прибегнуть к старому способу, тянуть жребии, когда из шляпы тянули маленькие клаптики бумаги с именем или числом. Забавно? Согласен, необычно, но, для меня лотерея, это хобби и для меня интересны любые новые методы выбора чисел для составления комбинаций. Так что, чем необычнее способ, тем лучше, особенно, если из этого можно провести целый эксперимент.
Я возьму набор настольного домашнего лото. Вместо клаптиков бумаги будут бочонки с числами. Вместо шляпы — мешочек. Для моего эксперимента подходит как нельзя лучше, я засовываю руку в мешочек и, не глядя достаю бочонок с числом, которое по теории и будет числом выбравшем меня сегодня. Точно попасть в выигрышную комбинацию и не надеюсь, но для системной игры можно попробовать доставать из мешочка скажем, по 9 чисел. Числа из моего эксперимента будут предназначены для «лото Максима» с лотерейной формулой 5 из 42. Я думаю, что для сравнения, надо обращать внимание, с какими эмоциями, в каком настроении или состоянии, я засовываю руку в мешочек.
Интересно, насколько близко к результату реального розыгрыша будут результаты из моего эксперимента: отдельно из ряд чисел, которые достанутся мне в хорошем настроении и отдельно из ряда чисел из плохого настроения. Тут надо подумать, какие эмоциональные состояния, которые точно могут влиять на выбор (и не только чисел) в обыденной жизни испытывает человек. Чувство страха, чувство благодарности, чувство радости.
Чувство голода! Кстати, люди, занимающиеся лечебным голоданием, которые голодают по несколько дней и даже недель, утверждают, что у них обостряется интуиция. Неделю точно не смогу, но сутки попробую…
Думаю, что заслуживают внимания числа которые будут кружить вокруг меня, а соответственно и попадут мне в руку, после сексуальной удовлетворенности. Да-а, глупо я наверное буду выглядеть, после выполнения своего супружеского долга, шурша мешочком с баченками, а после записывая результаты в блокнот. Ну, да ладно, 2 минуты стыда…., крупный выигрыш заставит забыть все
Скрин раздела клуба «Система на 15 чисел»
Тиражи в лотерее «лото Максима» проводятся три раза в неделю, вторник, четверг, и воскресенье. Для каждого тиража я буду выбирать по 9 чисел для каждого настроения и духовного или физического состояния, которое смогу выделить для себя. В лотерее с формулой 5 из 42 в системной игре на 9 чисел получается 126 комбинаций. Играть я буду виртуально. Комбинации буду составлять, используя инструмент клуба «Система на 15 чисел». Для проверки комбинаций после розыгрыша, буду использовать раздел клуба «хранилище». Эксперимент будит длится 12 тиражей подряд. Через месяц результат эксперимента опубликую на блоге.
Буду признателен, если еще кто-то проведет такой же эксперимент и поделится своими наблюдениями. Если нет бочонков с цифрами от набора настольного лото, можно нарезать примерно одинакового размера бумаги, и написать на ней числа в соответствии с формулой вашей лотереи.
Эксперимент закончен. Результат эксперимента смотрите здесь >>
Источник
Выбор случайных чисел: это сложнее, чем вы думаете
Вы когда-нибудь задумывались, насколько случайны случайные числа на самом деле?
Случайные числа имеют жизненно важное значение для обеспечения справедливого присуждения призов в лотереях. Самый простой способ определить победителя – присвоить каждому участнику уникальный номер, а затем использовать генератор случайных чисел, чтобы выбрать одно из этих чисел и получить приз.
Но вы когда-нибудь задумывались, как на самом деле работает генерация случайных чисел? Выбрать действительно случайное число сложнее, чем можно себе представить первоначально. На то есть свои причины.
Что такое случайность и зачем она нам нужна?
Прежде чем задаться вопросом, действительно ли генерируемые числа являются случайными, нужно определить, что подразумевается под словом «случайный». Для того чтобы дать определение случайности обратимся к словарю Мерриэм-Уэбстер: «отсутствие определенного плана, цели или образца» и «набор, каждый из элементов которого имеет равную вероятность появления».
Определение кажется верным, когда речь идет о случайных числах.
Выбирая призера лотереи, организаторы хотят, чтобы у всех участников были равные шансы на победу.
У людей, которые участвовали раньше в конкурсе, или у людей, чьи фамилии начинаются с определенной буквы, не должно быть больше шансов на победу. Все должны быть равны.
Когда дело доходит до многомиллионных лотерей, таких как Powerball, еще более важно, чтобы выигрышные числа были действительно случайными и их невозможно было предсказать. Любая слабость, которая делает выигрышные числа более предсказуемыми, делает игру несправедливой по отношению к игрокам – и может быть чрезвычайно дорогостоящей для компаний, проводящих лотереи.
Криптография, или создание надежных кодов, – еще одна отрасль, в которой используется случайность. Случайность жизненно важна для защиты ваших паролей и номеров кредитных карт в Интернете.
Если хакеры могут угадать шаблон, они могут взломать систему шифрования.
Именно это произошло во время Второй мировой войны, когда Алану Тьюрингу удалось взломать, казалось бы, не взламываемые машины Enigma, которые немцы использовали для шифрования военных приказов. Хотя было огромное количество потенциальных комбинаций кода, сами машины имели физические особенности. Тьюринг смог использовать их для взлома их шифрования… за считанные часы.
Человеческий мозг – плохой генератор случайных чисел
Быстро, представьте себе случайное число от 1 до 10! Что выбрали?
Если ваше число было 3 или 7, вы в большинстве. Человеческий мозг не лучший способ выбора случайных чисел. Если бы это было не так, при выборе случайного числа от 1 до 10 было бы равномерное распределение ответов. Каждое число было бы с 10% вероятностью выбора, а четные и нечетные числа были бы выбраны в 50% случаев. Но этого не происходит.
Наш мозг склонен по умолчанию выбирать определенные числа, когда сталкивается с подобным вопросом, либо потому, что мы предпочитаем определенные числа, либо потому, что одни числа «кажутся» более случайными, чем другие.
Чтобы не быть голословными, обратимся к исследованию Университета Васэда в Японии, когда ученые просили испытуемую группу назвать случайное число от 1 до 10. И вот его итоги:
Человеческий мозг явно плохой генератор случайных чисел, поэтому вам нужно выбрать другой метод, если вам действительно необходим случайный выбор.
Случайности настолько сложно добиться, что мы редко ее используем
Представьте, что вы стоите на вершине Эйфелевой башни с мешком с листьями, а внизу создана сетка с числами. Теперь попробуйте предсказать, на какое число упадет один лист, если его уронить в прохладный день. Кажется падение листа будет случайно в этом случае.
Однако, если написать написать программу, которая идеально анализирует такие факторы, как размер и форма листа, а также сила и направление ветра, было бы несложно предсказать, в какой сектор приземлится лист.
Большинство вещей, которые кажутся случайными, на самом деле не очень сложно предсказать. Сложно предсказать действительно случайные вещи, и эта задача настолько сложна, что мы это просто не делаем. За пределами некоторых сложных элементов квантовой физики все происходит в результате естественного порядка, который теоретически можно предсказать.
Насколько случайно число на самом деле, зависит от того, сколько у вас информации о методе, который его сгенерировал.
Псевдослучайность
Большинство действующих генераторов случайных чисел фактически работают по принципу «псевдослучайности».
Псевдослучайность означает, что метод выбора чисел можно предсказать теоретически, но на практике это практически невозможно.
Заключение
Генераторы случайных чисел используют множество интересных, трудно предсказуемых методов для достижения истинной случайности, таких как стена из лавовых ламп или количество протонов, излучаемых лазером.
Так что в следующий раз, когда вы просто выберете случайное число, подумайте, насколько сложно или даже невозможно быть действительно случайным!
Источник
Подробно о генераторах случайных и псевдослучайных чисел
Введение
Генераторы случайных чисел — ключевая часть веб-безопасности. Небольшой список применений:
- Генераторы сессий (PHPSESSID)
- Генерация текста для капчи
- Шифрование
- Генерация соли для хранения паролей в необратимом виде
- Генератор паролей
- Порядок раздачи карт в интернет казино
Как отличить случайную последовательность чисел от неслучайной?
Пусть есть последовательность чисел: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 . Является ли она случайной? Есть строгое определение для случайной величины. Случайная величина — это величина, которая принимает в результате опыта одно из множества значений, причём появление того или иного значения этой величины до её измерения нельзя точно предсказать. Но оно не помогает ответить на наш вопрос, так как нам не хватает информации для ответа. Теперь скажем, что данные числа получились набором одной из верхних строк клавиатуры. «Конечно не случайная» — воскликните Вы и тут же назовете следующие число и будете абсолютно правы. Последовательность будет случайной только если между символами, нету зависимости. Например, если бы данные символы появились в результате вытягивания бочонков в лото, то последовательность была бы случайной.
Чуть более сложный пример или число Пи
Последовательность цифры в числе Пи считается случайной. Пусть генератор основывается на выводе бит представления числа Пи, начиная с какой-то неизвестной точки. Такой генератор, возможно и пройдет «тест на следующий бит», так как ПИ, видимо, является случайной последовательностью. Однако этот подход не является критографически надежным — если криптоаналитик определит, какой бит числа Пи используется в данный момент, он сможет вычислить и все предшествующие и последующие биты.
Данный пример накладывает ещё одно ограничение на генераторы случайных чисел. Криптоаналитик не должен иметь возможности предсказать работу генератора случайных чисел.
Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)
Источники энтропии используются для накопления энтропии с последующим получением из неё начального значения (initial value, seed), необходимого генераторам случайных чисел (ГСЧ) для формирования случайных чисел. ГПСЧ использует единственное начальное значение, откуда и следует его псевдослучайность, а ГСЧ всегда формирует случайное число, имея в начале высококачественную случайную величину, предоставленную различными источниками энтропии.
Энтропия – это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации.
Можно сказать, что ГСЧ = ГПСЧ + источник энтропии.
Уязвимости ГПСЧ
- Предсказуемая зависимость между числами.
- Предсказуемое начальное значение генератора.
- Малая длина периода генерируемой последовательности случайных чисел, после которой генератор зацикливается.
Линейный конгруэнтный ГПСЧ (LCPRNG)
Распространённый метод для генерации псевдослучайных чисел, не обладающий криптографической стойкостью. Линейный конгруэнтный метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой следующей формулой:
где a (multiplier), c (addend), m (mask) — некоторые целочисленные коэффициенты. Получаемая последовательность зависит от выбора стартового числа (seed) X0 и при разных его значениях получаются различные последовательности случайных чисел.
Для выбора коэффициентов имеются свойства позволяющие максимизировать длину периода(максимальная длина равна m), то есть момент, с которого генератор зациклится [1].
Пусть генератор выдал несколько случайных чисел X0, X1, X2, X3. Получается система уравнений
Решив эту систему, можно определить коэффициенты a, c, m. Как утверждает википедия [8], эта система имеет решение, но решить самостоятельно или найти решение не получилось. Буду очень признателен за любую помощь в этом направлении.
Предсказание результатов линейно-конгруэнтного метода
Основным алгоритмом предсказания чисел для линейно-конгруэнтного метода является Plumstead’s — алгоритм, реализацию, которого можно найти здесь [4](есть онлайн запуск) и здесь [5]. Описание алгоритма можно найти в [9].
Простая реализация конгруэнтного метода на Java.
Отправив 20 чисел на сайт [4], можно с большой вероятностью получить следующие. Чем больше чисел, тем больше вероятность.
Взлом встроенного генератора случайных чисел в Java
Многие языки программирования, например C(rand), C++(rand) и Java используют LСPRNG. Рассмотрим, как можно провести взлом на примере java.utils.Random. Зайдя в исходный код (jdk1.7) данного класса можно увидеть используемые константы
Метод java.utils.Randon.nextInt() выглядит следующим образом (здесь bits == 32)
Результатом является nextseed сдвинутый вправо на 48-32=16 бит. Данный метод называется truncated-bits, особенно неприятен при black-box, приходится добавлять ещё один цикл в brute-force. Взлом будет происходить методом грубой силы(brute-force).
Пусть мы знаем два подряд сгенерированных числа x1 и x2. Тогда необходимо перебрать 2^16 = 65536 вариантов oldseed и применять к x1 формулу:
до тех пор, пока она не станет равной x2. Код для brute-force может выглядеть так
Вывод данной программы будет примерно таким:
Несложно понять, что мы нашли не самый первый seed, а seed, используемый при генерации второго числа. Для нахождения первоначального seed необходимо провести несколько операций, которые Java использовала для преобразования seed, в обратном порядке.
И теперь в исходном коде заменим
crackingSeed.set(seed);
на
crackingSeed.set(getPreviousSeed(seed));
И всё, мы успешно взломали ГПСЧ в Java.
Взлом ГПСЧ Mersenne twister в PHP
Рассмотрим ещё один не криптостойкий алгоритм генерации псевдослучайных чисел Mersenne Twister. Основные преимущества алгоритма — это скорость генерации и огромный период 2^19937 − 1, На этот раз будем анализировать реализацию алгоритма mt_srand() и mt_rand() в исходном коде php версии 5.4.6.
Можно заметить, что php_mt_reload вызывается при инициализации и после вызова php_mt_rand 624 раза. Начнем взлом с конца, обратим трансформации в конце функции php_mt_rand(). Рассмотрим (s1 ^ (s1 >> 18)). В бинарном представление операция выглядит так:
10110111010111100111111001110010 s1
00000000000000000010110111010111100111111001110010 s1 >> 18
10110111010111100101001110100101 s1 ^ (s1 >> 18)
Видно, что первые 18 бит (выделены жирным) остались без изменений.
Напишем две функции для инвертирования битового сдвига и xor
Тогда код для инвертирования последних строк функции php_mt_rand() будет выглядеть так
Если у нас есть 624 последовательных числа сгенерированных Mersenne Twister, то применив этот алгоритм для этих последовательных чисел, мы получим полное состояние Mersenne Twister, и сможем легко определить каждое последующее значение, запустив php_mt_reload для известного набора значений.
Область для взлома
Если вы думаете, что уже нечего ломать, то Вы глубоко заблуждаетесь. Одним из интересных направлений является генератор случайных чисел Adobe Flash(Action Script 3.0). Его особенностью является закрытость исходного кода и отсутствие задания seed’а. Основной интерес к нему, это использование во многих онлайн-казино и онлайн-покере.
Есть много последовательностей чисел, начиная от курса доллара и заканчивая количеством времени проведенным в пробке каждый день. И найти закономерность в таких данных очень не простая задача.
Задание распределения для генератора псевдослучайных чисел
Для любой случайной величины можно задать распределение. Перенося на пример с картами, можно сделать так, чтобы тузы выпадали чаще, чем девятки. Далее представлены несколько примеров для треугольного распределения и экспоненциального распределения.
Треугольное распределение
Приведем пример генерации случайной величины с треугольным распределением [7] на языке C99.
В данном случае мы берем случайную величину rand() и задаем ей распределение, исходя из функции треугольного распределения. Для параметров a = -40, b = 100, c = 50 график 10000000 измерений будет выглядеть так
Экспоненциальное распределение
Пусть требуется получить датчик экспоненциально распределенных случайных величин. В этом случае F(x) = 1 – exp(-lambda * x). Тогда из решения уравнения y = 1 – exp(-lambda * x) получаем x = -log(1-y)/lambda.
Можно заметить, что выражение под знаком логарифма в последней формуле имеет равномерное распределение на отрезке [0,1), что позволяет получать другую, но так же распределённую последовательность по формуле: x = -log(y)/lambda, где y есть случайная величина(rand()).
Тесты ГПСЧ
Некоторые разработчики считают, что если они скроют используемый ими метод генерации или придумают свой, то этого достаточно для защиты. Это очень распространённое заблуждение. Следует помнить, что есть специальные методы и приемы для поиска зависимостей в последовательности чисел.
Одним из известных тестов является тест на следующий бит — тест, служащий для проверки генераторов псевдослучайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.
В теории криптографии отдельной проблемой является определение того, насколько последовательность чисел или бит, сгенерированных генератором, является случайной. Как правило, для этой цели используются различные статистические тесты, такие как DIEHARD или NIST. Эндрю Яо в 1982 году доказал, что генератор, прошедший «тест на следующий бит», пройдет и любые другие статистические тесты на случайность, выполнимые за полиномиальное время.
В интернете [10] можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.
Источник