Почему runif не генерирует один и тот же результат каждый раз?

11

Почему генераторы случайных чисел, такие как runif()в R, не генерируют один и тот же результат каждый раз?

Например:

X <- runif(100)
X

генерирует разные выходы каждый раз.

В чем причина создания разных выходов каждый раз?

Какие функции у него есть в фоновом режиме, чтобы сделать это?

Химабинду Кунани
источник
3
Один из способов подумать об этом - спросить себя: «Хотели бы вы, чтобы генератор случайных чисел генерировал одинаковые числа каждый раз?»
теневик
2
@ssdecontrol: См Дилберт
Генри
2
Или xkcd
Генри

Ответы:

18

В глубине души это не просто вопрос R; это относится к генерации случайных чисел в более общем смысле.

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

Идея в том, что мы хотим получить последовательность значений, которые являются хорошим прокси для фактически случайных чисел. Обычной рабочей лошадкой генерации случайных чисел является равномерное распределение (из этого мы строим другие, как гауссовы случайные числа).

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

Например, многие просто работают над предыдущим:

Икс1знак равное(Икс0)Z1знак равноИкс1/мИкс2знак равное(Икс1)Z2знак равноИкс2/мИкс3знак равное(Икс2)Z3знак равноИкс3/м

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

Им требуется начальное ("начальное") целое число ( ), которое вы предоставляете (некоторым алгоритмам может потребоваться более одного начального числа). Если вы снова используете то же начальное число, вы получите ту же последовательность (что удобно для возможности воспроизведения результатов). Но иногда вам просто нужны какие-то случайные числа, и вам все равно, каково начальное число, если начальная точка отличается от предыдущей партии, которую вы использовали.Икс0

Так что, если вы не поставите семя, многие пакеты могут просто сделать его для вас. Некоторые пакеты просматривают последние несколько цифр на внутренних цифровых часах (обычно ими манипулируют). Некоторые (включая R) хранят последнее значение (целое числоИкс3

Посмотрите ?runifв R, и вы заметите, что он объясняет о существовании случайного начального числа со ссылкой на справку, ?.Random.seedкоторая объясняет большое количество генераторов случайных чисел, доступных в R (вы даже можете указать свой собственный). На той же странице справки объясняется, что если вы не использовали генерацию случайных чисел до или не задавали начальное число, для начала семя берется из часов, а затем сохраняется предыдущее значение (так что следующее полученное вами случайное число будет тот же, который вы получили бы, если бы в прошлый раз генерировали еще одно значение - он запоминает «где вы находитесь»).

Функция runifв R (как и многие другие подпрограммы генерации случайных чисел в других пакетах, которые обычно могут делать что-то подобное) знает о месте, где хранится начальное число случайных чисел. Это продолжает обновлять это значение, как оно идет. Таким образом, он может работать без необходимости явно передавать семя, но он все еще использует его; если вы его не дали, он просто использует тот, который был сохранен последним.

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

Glen_b - Восстановить Монику
источник
14

Вы должны установить случайное начальное число , чтобы каждый раз получать один и тот же результат. Используйте ? Set.seed для этого. Рассматривать:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Возможно, вам будет интересно прочитать это: Причины использования функции set.seed .

Gung - Восстановить Монику
источник
3
Хотя это объясняет механизм воспроизведения набора результатов, похоже, он не затрагивает сам вопрос, который задается вопросом, почему такое поведение не является автоматическим.
whuber
@whuber, я думаю, что вопрос не по теме здесь. Я проголосовал за немедленное закрытие и закрыл бы его, если бы имел такую ​​привилегию. Я отправил это, чтобы OP не был с пустыми руками.
gung - Восстановить Монику
запускать "set.seed (1)" каждый раз.
Nip