Как мне остановить set.seed() после определенной строки кода?

Я хотел бы закончить область set.seed() после определенной строки, чтобы иметь реальную рандомизацию для остальной части кода. Вот пример, в котором я хочу, чтобы set.seed() работал для «rnorm» (строка 4), но не для «nrow» (строка 9).

set.seed(2014)
f<-function(x){0.5*x+2}
datax<-1:100
datay<-f(datax)+rnorm(100,0,5)
daten<-data.frame(datax,datay)
model<-lm(datay~datax)
plot(datax,datay)
abline(model)
a<-daten[sample(nrow(daten),20),]
points(a,col="red",pch=16)
modela<-lm(a$datay~a$datax)
abline(modela, col="red")

Спасибо за предложения, действительно!


person Clyde Frog    schedule 29.03.2014    source источник


Ответы (4)


Просто используйте текущее системное время, чтобы «отменить» начальное число, введя новое уникальное случайное начальное число:

set.seed(Sys.time())

Если вам нужна более высокая точность, рассмотрите возможность получения метки системного времени в миллисекундах ( используйте функцию R system(..., intern = TRUE)).

person Robert Krzyzanowski    schedule 29.03.2014

set.seed(NULL)

См. справочные документы - ?set.seed:

«Если вызывается с seed = NULL, он повторно инициализируется (см. «Примечание»), как если бы еще не было установлено семя».

person Carlton Chen    schedule 25.10.2018

set.seed() работает только для следующего выполнения. так что то, что вы хотите, уже происходит.

см. этот пример

set.seed(12)
sample(1:15, 5)

[1] 2 12 13 4 15

sample(1:15, 5) # run the same code again you will see different results

[1] 1 3 9 15 12

set.seed(12)#set seed again to see first set of results
sample(1:15, 5)

[1] 2 12 13 4 15

person Akshay Kadidal    schedule 30.08.2017
comment
Вообще-то, нет. если вы запускаете set.seed(12), он запускает какой-то цикл сидов. Второй вызов sample будет всегда одинаковым. Пример: выполнить один раз set.seed(12), s1a <- sample(1:15, 5), затем s2a <- sample(1:15, 5). затем запустите set.seed(12), s1b <- sample(1:15, 5), затем s2b <- sample(1:15, 5), и вы получите identical(s1a, s1b)==TRUE и identical(s2a, s2b)==TRUE. Это также верно для всех последующих вызовов образцов. - person Bastien; 09.10.2019

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

person Keru    schedule 29.03.2014
comment
Псевдослучайность не помешает сценарию оставаться детерминированным. Он хочет, чтобы он был стохастическим после определенной точки. - person Robert Krzyzanowski; 29.03.2014
comment
Это неправда, см. комментарий @Bastien выше. - person hplieninger; 03.06.2020