Есть ли генератор псевдослучайных чисел, достаточно простой, чтобы сделать в вашей голове? - PullRequest
25 голосов
/ 13 октября 2010

Существуют ли генераторы псевдослучайных чисел, которые достаточно легко сделать с помощью умственной арифметики или умственной арифметики плюс подсчет пальцев. Очевидно, это ограничивается довольно простой математикой - это должно быть что-то, что может сделать кто-то со средними математическими способностями, или, возможно, средние способности для программиста, а не вундеркинд.

Самый простой из найденных мною методов - Средний квадрат , но он не только известен как плохой источник случайности, но и без карандаша и бумаги выглядит слишком сложным.

Если единственный способ сделать это - ограничить диапазон, как, возможно, он может выводить только 8-битные числа, это нормально. Я подозреваю, что один из стандартных алгоритмов PRNG был бы достаточно прост в 8-битной версии, но я не знаю достаточно, чтобы упростить любой из них от 32-битной версии до 8-битной версии. (Все те, на которые я смотрел, зависят от специально выбранных начальных чисел, которые различаются в зависимости от того, сколько бит вы работаете, и обычно даются только 32- и 64-битные примеры.)

Ответы [ 8 ]

40 голосов
/ 13 октября 2010

Псевдослучайный ( по Дилберту ):

Dilbert Cartoon of 2001-10-25

15 голосов
/ 13 октября 2010

A регистр сдвига с линейной обратной связью довольно прост, если вам удобно думать в двоичном (или, возможно, шестнадцатеричном, так как между ними легко сопоставлять).

Более сложным является Xorshift , но если вы знаете свои побитовые операции, то вполне возможно работать и с ним.

4 голосов
/ 13 октября 2010

В своей голове вы можете выполнить «семантическую» генерацию случайных чисел: -)

Как взять случайное слово и вычислить из него некоторую метрику, повторять до тех пор, пока не получите число с разумной длиной.

Например, слово «упражнение» может быть преобразовано в 10100101b (вы можете увидеть мою идею преобразования здесь).

3 голосов
/ 01 июня 2013

Это довольно просто и должно вписываться в головы большинства людей:

  1. Начните с трехзначного номера семян (поиск подходящего семени может быть более сложной проблемой).
  2. Умножьте это на девять.
  3. Отделите четвертую цифру от трех нижних и сложите вместе две цифры для получения новой трехзначной цифры.
  4. Запишите эти цифры. Чтобы замаскировать шаблон, вы можете записать только одну или две цифры.
  5. При необходимости повторите 2-4.

До тех пор, пока вы не начнете с нуля, будет повторяться период 4500 результатов. Выходные данные не выглядят «случайными», но они представлены в десятичном виде, и даже истинные случайные результаты не выглядят случайными, вот почему люди сосут эту задачу.

Я мог бы попытаться взломать программу, чтобы беспристрастно преобразовать ее в двоичный файл, чтобы протестировать ее.

Альтернативные конфигурации:

  • три цифры и умножить на 3
  • четыре цифры и умножить на 6
  • пять цифр и умножить на 2
3 голосов
/ 13 октября 2010

Как насчет Blum Blum Shub, но простые числа слишком малы для безопасного использования? Надежно используется медленно, но включает в себя операции, с которыми мы привыкли иметь дело, так что вы можете достичь управляемой скорости без излишней практики, может быть, с M = 437 или умеренно большим.

Я сомневаюсь, что все, что я мог сделать в моей голове, будет в любом случае безопасным. Я просто не могу вспомнить достаточно большие числа, чтобы работать без ошибок в состоянии разумного размера.

Вы можете легко сделать 10-битную LFSR на пальцах, если у вас есть приличные сухожилия; -)

Не прямой ответ, но в зависимости от того, почему вы спрашиваете, вас может заинтересовать Пасьянс , который генерирует поток ключей (то есть псевдослучайную последовательность), используя колоду карт. Не может быть сделано в вашей голове, но не требует карандаша и бумаги.

0 голосов
/ 25 марта 2014

Если недетерминированные алгоритмы разрешены, ваши глаза находятся в вашей голове, так что насчет чего-то вроде «количества красных объектов передо мной плюс количество синих вещей по модулю числа зеленых вещей плюс высота самого высокогостек вещей, содержащих хотя бы одну вещь с буквами g и заглавными буквами A. "

Я уверен, что есть способ сделать это, который на самом деле был бы довольно случайным.

0 голосов
/ 23 декабря 2012

Самый простой способ - сгенерировать несколько чисел, приходящих вам в голову, а затем сложить и изменить 10 из каждой цифры.Чем больше чисел вы добавите, тем более случайным и менее предвзятым будет.

510932
689275
539108
======
628205
0 голосов
/ 27 января 2012

Да, я знаю о том, что, возможно, можно сделать в вашей голове, и если дальнейшее изменение может привести к действительно случайным числам, возьмите список чисел, упорядоченный список чисел в базе десяти, который будет проще всего вычислить в Сложите их вместе, оставьте только однозначный номер места этого полученного числа, а затем поместите его в конец списка и уберите первую цифру, а затем повторите, что это не приведет к получению истинных случайных чисел, но достаточно случайным и в зависимости от размера списка номеров, которые вы решите использовать, в конечном итоге будет повторяться, но для большого начального списка не будет повторяться в течение достаточно большого промежутка времени.

например, если бы я использовал только 5 чисел в списке 12345, то следующий список был бы 2345, а самая правая цифра 1 + 2 + 3 + 4 + 5 или 15 или 5, так что список был бы 23455, теперь тот, который упал выключен и больше не используется, поэтому следующая сумма складывается до 20 с -1 (15 + 5 минус тот, который выпал), поэтому следующий список будет 34559, затем 45596, затем 55969, затем 59694, теперь мы остановимся, потому что мы сгенерировали полные семена стоит цифр, поэтому изначально у нас было 12345.

Для следующего начального числа мы получили 59694, теперь есть своего рода ярлык, который вы также можете использовать после вычисления полного начального числа или использования самого ярлыка, то есть вы берете последнюю цифру и умножаете ее на 2 и вычитаем первую цифру, удваивая одну цифру, легко сделать в голове, важно запомнить все остальные цифры и их порядок в последовательности, это в лучшем случае будет производить только псевдослучайные числа с некоторым длинным повторением В разы больше список чисел, которые вы используете, но исходный список должен быть выбран с осторожностью, как, например, не выбирайте все нули, как вы список, или у вас будет бесконечный поток нулей, и некоторые наборы цифр будут производить более длительные циклы повторения, чем у других (но, возможно, это следует делать на бумаге, если у вас есть карандаш или ручка и лист бумаги под рукой ... :) надеюсь, это поможет .. (немного изменено, что делает начало очень хорошим генератор случайных чисел) наслаждайтесь ...

Надеюсь, лучше, если нет, тогда скажи мне :) (Я никогда не очень хорошо говорил по-английски!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...