Подтвердить что ты не робот

Могу ли я получить .seed() как-то?

В отношении оператора set.seed() можно ли получить семя вместо запуска некоторого кода, если я не указал его явно?

Я повторно запускаю некоторый код (интерактивно/на консоли), содержащий функцию, которая рандомизирует некоторый образец входных данных (эта функция является частью пакета kohonen). Поиграв с ним в течение некоторого времени, чтобы увидеть разнообразие результатов (это была "нестабильная" проблема), я заметил, что один результат был довольно интересным. Я, конечно, не использовал set.seed(), но задавался вопросом, могу ли я получить семя после запуска кода для воспроизведения результата?

В ?set.seed я вижу

.Random.seed сохраняет набор семян для равномерного генератора случайных чисел

Но я не знаю, как это помогает.

4b9b3361

Ответ 1

Если вы не сохранили семя, нет общего способа "откатить" генератор случайных чисел в предыдущее состояние после того, как вы заметили случайную ничью. Вперёд, что вы можете сделать, это сохранить значение .Random.seed вместе с результатами ваших вычислений. Что-то вроде этого.

x <- .Random.seed
result <- <your code goes here>
attr(result, "seed") <- x

Тогда вы можете reset PRNG следующим образом; result2 должен быть таким же, как result.

.Random.seed <- attr(result, "seed")
result2 <- <your code goes here>

Ответ 2

Ответ Hong выше выше. Для быстрых и грязных решений, когда я просто повторно выполняю целый script, пока не получаю интересное поведение, я произвольно выбираю целое число, распечатываю его, а затем использую его как семя. Если мой конкретный ход имеет интересное поведение, я отмечаю, что семя:

eff_seed <- sample(1:2^15, 1)
print(sprintf("Seed for session: %s", eff_seed))
set.seed(eff_seed)

Ответ 3

Чтобы добавить к ответу mpettis, если вы не хотите повторно запускать script вручную - генерировать новые случайные семена каждой итерации - Вы могли бы сделать что-то вроде этого:

# generate vector of seeds
eff_seeds <- sample(1:2^15, runs)

# perform 'runs' number of executions of your code
for(i in 1:runs) {
    print(sprintf("Seed for this run: %s", eff_seeds[i]))
    set.seed(eff_seeds[i])

    # your code here
    # don't forget to save your outputs somehow
}

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

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

Ответ 4

> rnorm(5)
[1] -0.17220331 -0.31506128 -0.35264299  0.07259645 -0.15518961
> Seed<-.Random.seed
> rnorm(5)
[1] -0.64965000  0.04787513 -0.14967549  0.12026774 -0.10934254
> set.seed(1234)
> rnorm(5)
[1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
> .Random.seed<-Seed
> rnorm(5)
[1] -0.64965000  0.04787513 -0.14967549  0.12026774 -0.10934254

Ответ 5

Я предлагаю следующий подход следующим образом:

  • Запустите это:

для (семя в 1:20) {  печать (семена)   }

  1. Для того, что вас интересует, вы знаете семя. Итак, если семя переменной содержит целое число, для которого был получен желаемый результат в цикле, перейдите к 3.

  2. Запустите это:

set.seed(начальный)

Надеюсь, это поможет!

Приветствия,

Хуан