种子序列-(寻找特定结果)

时间:2019-03-17 20:49:06

标签: r loops seed

如何更改种子,以便为我提供所需的结果,找到匹配项后,如何获取种子编号?

代码:

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

3 个答案:

答案 0 :(得分:1)

您可以执行这种蛮力方法。请记住,这不是有效的方法,但是可以解决问题。基本上,您要遍历种子编号并打印提供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

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:0)

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

所以这并不意味着您得到的种子在不同情况下将与其他种子产生相同的结果。