我正在向CRAN提交一个程序包,该程序包确定时间序列中的中断,为此,我在Montecarlo仿真中对该程序包的某些功能进行了识别。为了保证从执行蒙特卡洛模拟的函数中输入的相同结果相同,我在函数内部设置了一个种子。 CRAN主持人告诉我:“请不要在函数中将种子设置为特定的数字。”
问题是,如果未设置种子,如何用相同的输入获得相同的结果。这是一个了解问题的示例,其中function2
设置了一个种子,并且结果总是相等。比较max2
和max4
,相反funtion1
进行相同但不设置种子,并且结果有所不同。
x <- c(1:100)
#Function without set.seed
function1 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
#Function that set.seed
function2 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
set.seed(1234)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
max1 <- function1(x)
max2 <- function2(x)
max3 <- function1(x)
max4 <- function2(x)
同意评论。这样做
myFunction <-function (x, y,z, seed = NULL) {
if (length(seed) ) set.seed(seed)
# the function guts
}