Чому руніф не створює однаковий результат кожного разу?


11

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

Наприклад:

X <- runif(100)
X

щоразу генерує різні результати.

Яка причина щоразу створювати різні результати?

Які функції функціонують у фоновому режимі для цього?


3
Один із способів задуматися над цим - запитати себе: "чи хочете ви, щоб ваш генератор випадкових чисел генерував однакові числа кожного разу?"
shadowtalker

2
@ssdecontrol: Дивіться Ділберта
Генрі

2
Або xkcd
Генрі

Відповіді:


18

По суті це насправді не просто питання R; це стосується генерації випадкових чисел загалом.

"Випадкові" числа дуже важливі у багатьох частинах статистики. Нам потрібні випадкові величини, які ми генеруємо, щоб мати певні властивості, і (як правило) багато зусиль йде на побудову генераторів випадкових чисел та перевірку їх властивостей.

Ідея полягає в тому, що ми хочемо отримати послідовність значень, які є хорошим проксі для фактично випадкових чисел. Звичайна робоча конячка генерації випадкових чисел - рівномірний розподіл (з цього ми побудуємо інші, як Гауссові випадкові числа).

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

Наприклад, багато хто просто працює над попереднім:

х1=f(х0)z1=х1/мх2=f(х1)z2=х2/мх3=f(х2)z3=х3/м

хzf

х0

х3

Дивіться ?runifв R, і ви зауважите, що він пояснює існування випадкових насінин із посиланням на довідку про те, ?.Random.seedщо пояснює велику кількість генераторів випадкових чисел, доступних у R (ви можете навіть поставити свій власний). Ця ж сторінка довідки пояснює, що якщо ви раніше не використовували генерацію випадкових чисел або не встановили насіння, то для початку насіння береться з годинника, а потім зберігається попереднє значення (так що наступне випадкове число, яке ви отримаєте, було б той самий, який ви отримали, якби минулого разу ви створили ще одне значення - воно запам'ятовує "куди вам належить").

Функція runifв R (як і чимало інших процедур генерації випадкових чисел у інших пакунках, які зазвичай можуть робити щось подібне) знає про місце зберігання насіння випадкових чисел. Він постійно оновлює це значення в міру його продовження. Таким чином, він може працювати без явного передавання насіння, але він все одно використовує; якщо ви не дали цього, він просто використовує той, який він зберег останнім.

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


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 .


3
Хоча це пояснює механіку відтворення набору результатів, схоже, це не стосується самого питання, яке задається питанням, чому така поведінка не є автоматичною.
whuber

@whuber, я думаю, питання тут не є віддаленою темою. Я проголосував за закриття миттєво і закрив би його, якби я мав цю привілей. Я розмістив це, щоб ОП не була з порожніми руками.
gung - Відновіть Моніку

щоразу запускайте "set.seed (1)".
Nip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.