种子序列-(寻找特定结果)
Sequence of seed-(looking for an specific result)
我怎样才能改变种子,以便它给我正在寻找的结果,当找到匹配项时,我怎样才能得到种子的编号?
代码:
set.seed(0)
delta_S<- rep(0,10)
S<- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
S
S[11]
我找S[11]的结果是111.54
您可以使用这种蛮力方法。请记住,这效率不高,但可以解决问题。基本上,您想遍历种子数并打印使 S[11] 等于 111.54 的种子。我将结果四舍五入到两位小数。在 10,000 个种子中,我发现两个 S[11] 等于 111.54:535 和 1937.
for (seed_number in 1:10000){
set.seed(seed_number)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
if(round(S[11],2)==111.54) print(paste("seed is",seed_number))
}
[1] "seed is 535"
[1] "seed is 1937"
使用您的代码,您可以验证 set.seed(535)
将导致 S[11] = 111.5372。 set.seed(1937)
也是如此
set.seed(535)
delta_S<- rep(0,10)
S<- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
S[11]
#[1] 111.5372
您可以使用 while 循环
S = rep(0, 100)
j = 0
# You can vary digits in order to obtain more precision if you wish
while(round(S[11], digits=2) != 111.54){
j = j + 1
set.seed(j)
delta_S<- rep(0,10)
S <- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
}
> j
535
> S
[1] 100.0000 94.6090 103.9302 104.7556 103.1598 105.6781 106.1706 109.8297 109.4760 107.2198 111.5372
> S[11]
111.5372
Pierre Laopointe 提供了解决此问题的好方法,但请注意您得到了 2 个合乎逻辑的答案,因为:
set.seed(535)
for(i in 1:10){
+ epsilon[i]=rnorm(1,0,1)
+ delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+ S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5372
> set.seed(1937)
> for(i in 1:10){
+ epsilon[i]=rnorm(1,0,1)
+ delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+ S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5388
您有 10 次随机 epsilon[i],我不知道您是否需要此信息,但重要的是它们在每个选项中都不同
> set.seed(535)
> rnorm(10,0,1)
[1] -1.3651733 2.2988608 0.1215605 -0.4354961 0.5174488 0.0426911 0.7590733 -0.1467427 -0.5647193 0.8985600
> set.seed(1937)
> rnorm(10,0,1)
[1] -0.780397161 -1.862636176 1.900480228 0.999418781 0.492969410 -0.005050631 -0.130317961 0.140431618 0.621808733
[10] 0.767121606
因此,这并不意味着您获得的种子在不同情况下会与其他种子产生相同的结果。
我怎样才能改变种子,以便它给我正在寻找的结果,当找到匹配项时,我怎样才能得到种子的编号?
代码:
set.seed(0)
delta_S<- rep(0,10)
S<- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
S
S[11]
我找S[11]的结果是111.54
您可以使用这种蛮力方法。请记住,这效率不高,但可以解决问题。基本上,您想遍历种子数并打印使 S[11] 等于 111.54 的种子。我将结果四舍五入到两位小数。在 10,000 个种子中,我发现两个 S[11] 等于 111.54:535 和 1937.
for (seed_number in 1:10000){
set.seed(seed_number)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
if(round(S[11],2)==111.54) print(paste("seed is",seed_number))
}
[1] "seed is 535"
[1] "seed is 1937"
使用您的代码,您可以验证 set.seed(535)
将导致 S[11] = 111.5372。 set.seed(1937)
set.seed(535)
delta_S<- rep(0,10)
S<- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
S[11]
#[1] 111.5372
您可以使用 while 循环
S = rep(0, 100)
j = 0
# You can vary digits in order to obtain more precision if you wish
while(round(S[11], digits=2) != 111.54){
j = j + 1
set.seed(j)
delta_S<- rep(0,10)
S <- rep(100,10)
epsilon<- rep(0,10)
for(i in 1:10){
epsilon[i]=rnorm(1,0,1)
delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
S[i+1]=S[i]+delta_S[i]
}
}
> j
535
> S
[1] 100.0000 94.6090 103.9302 104.7556 103.1598 105.6781 106.1706 109.8297 109.4760 107.2198 111.5372
> S[11]
111.5372
Pierre Laopointe 提供了解决此问题的好方法,但请注意您得到了 2 个合乎逻辑的答案,因为:
set.seed(535)
for(i in 1:10){
+ epsilon[i]=rnorm(1,0,1)
+ delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+ S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5372
> set.seed(1937)
> for(i in 1:10){
+ epsilon[i]=rnorm(1,0,1)
+ delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+ S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5388
您有 10 次随机 epsilon[i],我不知道您是否需要此信息,但重要的是它们在每个选项中都不同
> set.seed(535)
> rnorm(10,0,1)
[1] -1.3651733 2.2988608 0.1215605 -0.4354961 0.5174488 0.0426911 0.7590733 -0.1467427 -0.5647193 0.8985600
> set.seed(1937)
> rnorm(10,0,1)
[1] -0.780397161 -1.862636176 1.900480228 0.999418781 0.492969410 -0.005050631 -0.130317961 0.140431618 0.621808733
[10] 0.767121606
因此,这并不意味着您获得的种子在不同情况下会与其他种子产生相同的结果。