Что такое семя в генераторе случайных чисел?

21

Я пробовал обычный поиск в Google и т. Д., Но большинство ответов, которые я нахожу, либо несколько неоднозначны, либо специфичны для языка / библиотеки, например Python или C ++ stdlib.hи т. Д. Я ищу независимый от языка математический ответ, а не специфику библиотеки.

В качестве примера многие говорят, что начальное число является начальной точкой генератора случайных чисел, и одно и то же начальное число всегда создает одно и то же случайное число. Что это означает? Означает ли это, что выходное число является детерминированной функцией определенного начального числа, а случайность определяется значением начального числа? Но если это так, то, предоставляя начальное число, не мы, программисты, создаем случайность вместо того, чтобы позволить машине делать это?

Кроме того, что означает отправная точка в этом контексте? Является ли это неправильным способом сказать элемент области отображения ? Или я что-то не так делаю? F : XYxXf:XY

Della
источник
7
Я не чувствую себя достаточно компетентным, чтобы написать ответ, но вы можете найти статью в Википедии о просветлении Мерсенна Твистера , особенно раздел об инициализации . Короче говоря, генератор псевдослучайных чисел, такой как Mersenne Twister, в конечном итоге будет повторять свой вывод. В случае MT период имеет длину 2^19937 − 1. Семя - это точка этой чрезвычайно длинной последовательности, где запускается генератор. Так что да, это детерминистично.
IonicSolutions
1
Генератор псевдослучайных чисел представляет собой бесконечно повторяющийся фиксированный список чисел. Где это начинается? Ты должен сказать.
whuber
2
@ Whuber Я действительно думаю, что ваш комментарий будет отличным ответом.
Дэвид З

Ответы:

22

Большинство генераторов псевдослучайных чисел (PRNG) построены на алгоритмах, использующих какой-то рекурсивный метод, начиная с базового значения, которое определяется входом, называемым «начальным числом». PRNG по умолчанию в большинстве статистических программ (R, Python, Stata и т. Д.) Представляет собой алгоритм Мерсенна Твистера MT19937, изложенный в Matsumoto и Nishimura (1998) . Это сложный алгоритм, поэтому лучше прочитать статью, если вы хотите узнать, как он работает в деталях. В этом конкретном алгоритме существует рекуррентное отношение степени , а входное семя - это начальный набор векторов . Алгоритм использует линейное рекуррентное отношение, которое генерирует:х 0 , х 1 , . , , , х н - 1nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

где и и являются объектами, которые могут быть указаны в качестве параметров в алгоритме. Поскольку начальное число дает начальный набор векторов (и другие фиксированные параметры для алгоритма), последовательность псевдослучайных чисел, генерируемых алгоритмом, является фиксированной. Если вы измените начальное число, то вы измените начальные векторы, которые изменят псевдослучайные числа, сгенерированные алгоритмом. Это, конечно, функция семени.r A1mnrA

Теперь важно отметить, что это только один пример, использующий алгоритм MT19937. Есть много PRNG, которые можно использовать в статистическом программном обеспечении, и каждый из них включает в себя разные рекурсивные методы, и поэтому начальное значение означает разные вещи (в техническом плане) в каждом из них. Вы можете найти библиотеку PRNGs для Rв этой документации , в котором перечислены доступные алгоритмы и документы , которые описывают эти алгоритмы.

Цель начального числа состоит в том, чтобы позволить пользователю «заблокировать» генератор псевдослучайных чисел, чтобы позволить воспроизводимый анализ. Некоторым аналитикам нравится устанавливать начальное число с использованием генератора истинных случайных чисел (TRNG), который использует аппаратные входы для генерации начального начального числа, а затем сообщать об этом как заблокированное число. Если начальное значение задано и передано исходным пользователем, то одитор может повторить анализ и получить ту же последовательность псевдослучайных чисел, что и исходный пользователь. Если начальное число не установлено, тогда алгоритм обычно будет использовать какой-либо начальный уровень по умолчанию (например, из системных часов), и, как правило, будет невозможно воспроизвести рандомизацию.

Восстановить Монику
источник
+1. Было бы хорошо добавить, что (обычно) происходит, если кто-то явно не предоставляет начальное число.
говорит амеба: восстанови Монику
1
@amoeba: 4-й параграф моего Ответа, кратко обсуждает это.
BruceET
1
Хотя это отвечает основам вопроса, это не касается того, зачем нам это нужно в симуляциях. Очень трудно произвести ИСТИННУЮ случайность - и когда она у вас есть, вы не можете воспроизвести исходный ответ! Введите PNRG ... со всеми своими проблемами.
Пол Пальмпье
@amoeba: Как я и просил, я добавил дополнительный абзац, чтобы уточнить это.
Восстановить Монику
1
Спасибо. «Default seed» звучит так, как будто это всегда одно и то же значение по умолчанию seed; Я имел в виду, что обычно семя берется из системных часов. Я думаю, это полезно знать.
говорит амеба: восстанови Монику
16

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

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

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

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

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

Один тест генератора, чтобы увидеть , если его последовательные пары в «наблюдений» смоделированные в на самом деле выглядят , как они заполняют единичный квадрат в произвольном порядке. (Сделано дважды ниже.) Немного мраморный вид является результатом присущей изменчивости. Было бы очень подозрительно получить сюжет, который выглядел бы совершенно равномерно серым. [В некоторых разрешениях может быть регулярный муар; пожалуйста, измените увеличение вверх или вниз, чтобы избавиться от этого поддельного эффекта, если он произойдет.]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

введите описание изображения здесь

Иногда полезно установить семена. Вот некоторые из них:

  1. При программировании и отладке удобно иметь предсказуемый результат. Так много программистов помещают set.seedоператор в начало программы, пока не будут написаны и отлажены.

  2. При обучении симуляции. Если я хочу показать студентам, что я могу смоделировать броски честного кубика, используя sampleфункцию в R, я мог бы обмануть, запустив много симуляций и выбрав тот, который ближе всего подходит к целевому теоретическому значению. Но это дало бы нереалистичное впечатление о том, как на самом деле работает симуляция.

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

    Например, вероятность получения 10 при двух справедливых костей составляетПроведя миллион экспериментов с двумя кубиками, я должен получить точность в два-три места. Погрешность симуляции в 95% составляет около2

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. При обмене статистическим анализом, который включает в себя моделирование. В настоящее время многие статистические анализы включают некоторое моделирование, например, тест перестановки или пробоотборник Гиббса. Показывая начальное число, вы позволяете людям, которые читают анализ, точно воспроизводить результаты, если они того пожелают.

  4. При написании академических статей, связанных с рандомизацией. Академические статьи обычно проходят несколько раундов рецензирования. График может использовать, например, точки с произвольным джиттером, чтобы уменьшить переполнение. Если анализ должен быть слегка изменен в ответ на комментарии рецензента, было бы хорошо, если бы конкретное несвязанное дрожание не менялось между раундами рецензирования, что может приводить в замешательство особенно придирчивых рецензентов, поэтому вы должны установить начальное значение перед дрожанием.

BruceET
источник
1
Очень приятно +1. Я позволил себе добавить четвертое замечание.
С. Коласса - Восстановить Монику
Таким образом, вы имеете в виду, что генератор чисел псевдорандром в основном хранит периодическую последовательность случайного числа (равномерно распределенную в [0, 1]), а начальное число является просто индексом последовательности? Значит ли это, что сгенерированное случайное число является детерминированной функцией начального числа?
Делла
9
Вам не нужен квантовый компьютер, чтобы использовать квантовые явления, чтобы иметь генератор случайных чисел ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux
1
@Della. У вас по сути правильная идея. Но, пожалуйста, поймите, что на практике «период» должен быть действительно огромным. (Независимо от того, насколько велик ваш проект симуляции, вы не хотите, чтобы он повторялся.) Например, IonicSolutions комментирует после Q, что генератор Mersenne Twilster имеет период несколько больше, чем я могу легко визуализировать. // Если вы знаете семя, вы можете создать псевдослучайный seq оттуда. // Генераторы использовались для шифрования сообщений. Но стандарты для безопасных генераторов для шифрования отличаются от стандартов для генераторов для моделирования вероятности. 2199371,
BruceET
@Guiroux. Возможность, которую я пытался упомянуть о квантовых компьютерах, заключалась в том, чтобы иметь настоящие генераторы случайных чисел так же быстро, как сегодняшние генераторы псевдослучайных чисел. В 1950-х годах источники «истинных» случайных чисел использовались для рандомизации при разработке экспериментов и (медленных, ограниченных) вероятностных симуляций. Возможно увидеть миллион случайных цифр .
BruceET
0

TL; DR;

Семя обычно позволяет воспроизводить последовательность случайных чисел. В этом смысле они не являются истинными случайными числами, но являются «псевдослучайными числами», следовательно, Генератор PNR (PNRG). Это реальная помощь в реальной жизни!

Немного подробнее:

Практически все генераторы «случайных» чисел, реализованные на компьютерных языках, являются генераторами псевдослучайных чисел. Это связано с тем, что с учетом начального значения (===> начального числа) они всегда будут предоставлять одинаковую последовательность псевдослучайных результатов. Хороший генератор создаст последовательность, которую невозможно отличить - в статистическом выражении - от истинной случайной последовательности (бросить настоящий кубик, настоящую монету и т. Д.).

Во многих случаях симуляции вы хотите получить настоящий «случайный» опыт. Тем не менее, вы также хотите иметь возможность воспроизвести свои результаты. Зачем? Ну, по крайней мере, регуляторы заинтересованы в этой специфической вещи.

Там есть много, чтобы погрузиться в. Люди даже делают анализ на «лучшее» случайное семя. По моему мнению, это делает их модель недействительной, поскольку они не могут обрабатывать «истинное» случайное поведение - или их PRNG не подходит для их реализации. Большую часть времени они просто не делают достаточного количества симуляций - но они требуют времени.

А теперь представьте себе «настоящий» ГСЧ. Это можно реализовать на основе некоторой случайности в машине. Если вы берете только случайное начальное число (например, время сейчас), вы создаете случайную начальную точку, но случайность последовательности все еще зависит от алгоритма определения следующих чисел. В большинстве случаев это более важно, чем отправная точка, поскольку распределение результатов определяет фактический «результат». Если ваша последовательность должна быть действительно случайной, как бы вы это реализовали? Можно сказать, что тактовые импульсы компьютера являются детерминированными, и в противном случае, вероятно, они будут демонстрировать большую автокорреляцию. Так что ты можешь сделать? На данный момент лучшая ставка заключается в реализации надежного PNRG.

Квантовые вычисления? Я не уверен, что это исправит.

Пол Пальмпье
источник