R набор.область применения seed ()

мой скрипт R вызывает подфункции, которые содержат set.семя.)( Что такое объем.seed()? Повлияет ли это также на основную программу, которая его вызывает?

более конкретно

# main program
callsubfun()

... some statement ...

sample.int(100,20)



# sub function
callsubfun <- function(x,y,...){
   set.seed(100)
   ... do the work ...
   return(something)
}

3 ответов


set.seed действительно глобальный. Но обратите внимание на это из примера в ?set.seed:

## If there is no seed, a "random" new one is created:
rm(.Random.seed); runif(1); .Random.seed[1:6]

это означает, что вы можете позвонить rm(.Random.seed, envir=.GlobalEnv) либо в конце вашей функции, либо после вызова функции, чтобы отделить остальную часть программы от вызова set.seed в функции.

чтобы увидеть это в действии, запустите следующий код в двух разных Р сессий. Результаты обеих сессий должны быть одинаковыми. Затем повторно запустите код снова в двух новых сеансах R с помощью rm линия закомментированная. Вы увидите, что выходные данные в двух новых сеансах теперь отличаются, указывая, что вызов set.seed в функции не передана воспроизводимость в основную программу.

subfun <- function() {
    set.seed(100)
    rnorm(1)
    #rm(.Random.seed, envir=.GlobalEnv)
}

subfun()
#[1] -0.5022

rnorm(1)
# [1] 0.1315

вот почему вы не должны делать это:

> set.seed(100)
> rnorm(1)
[1] -0.5021924
> rnorm(1)
[1] 0.1315312

> rand <- function() set.seed(100)
> rand()

> rnorm(1)
[1] -0.5021924   # Ouch!

ответ BondedDust в порядке, но не всегда Ой!

вы можете использовать set.seed () для воспроизведения вашего алгоритм. то есть любой может воспроизвести ваши результаты.

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

set.seed(123)
rand<-rnorm(10)
plot(density(rand))

Если вы используете другое семя, вы получите другие результаты

set.seed(234)
rand<-rnorm(10)
plot(density(rand))

оба правильны, но это может быть проще помочь вам, если семя было известно. Кстати, просто используйте set.семя однажды попало в твой рутин, потому что ты мог бы произвести зависимость в ваших случайных числах. Мы желаем независимых случайных чисел в симуляции.