В глубине души это не просто вопрос 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 (как и многие другие подпрограммы генерации случайных чисел в других пакетах, которые обычно могут делать что-то подобное) знает о месте, где хранится начальное число случайных чисел. Это продолжает обновлять это значение, как оно идет. Таким образом, он может работать без необходимости явно передавать семя, но он все еще использует его; если вы его не дали, он просто использует тот, который был сохранен последним.
Что касается того, почему он выдает разные выходные данные каждый раз (если вы не говорите, чтобы он давал одну и ту же последовательность): он делает это потому, что одни и те же значения каждый раз, как правило, будут очень контрпродуктивными - у него не будет свойств, которые повторяются случайная выборка будет иметь, делая это не очень полезным для точек размещения, для которых мы используем генераторы случайных чисел.