【问题标题】:Sequence of seed-(looking for an specific result)种子序列-(寻找特定结果)
【发布时间】:2019-08-08 06:07:10
【问题描述】:

如何更改种子,以便它给我我正在寻找的结果,当找到匹配项时,我如何获得种子的编号?

代码:

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

【问题讨论】:

    标签: r loops seed


    【解决方案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
    

    【讨论】:

    • 您好,感谢您抽出宝贵时间回答我的问题。现在我可以比较两种不同的方法。非常感谢。
    • @Delator:不客气,很高兴我能提供帮助。如果您正在寻找更准确的值,请更改圆形条件下的精度。如果将条件更改为 digits=3,则种子 19256 将为您提供 S[11] = 111.5401,如果您将条件设置为 digits=4,则种子 1682132 将为您提供 S[11] = 111.54
    • @Deltaor 我用 100,000 个种子运行循环,set.seed(19256) 给出 S[11]=111.540095839911
    • 非常感谢!!我正要这样做,但这是用你发布的代码或尼山的代码。自从我第一次使用这个网站以来,我很困惑。
    • @Deltaor,我认为你应该使用你最熟悉的代码。
    【解决方案2】:

    您可以使用这种蛮力方法。请记住,这不是有效的,但它确实有效。基本上,您希望遍历种子编号并打印使 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
    

    【讨论】:

    • 非常感谢您的解释。这不仅对这段代码有帮助,对更多代码也有帮助。我将使用更高的 seed_number 运行此代码,因为我正在寻找更接近的值。再次感谢。
    • @Deltaor 好。不要忘记勾选您最喜欢的解决方案,以便其他 SO 用户知道此问题已得到解答。
    【解决方案3】:

    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
    

    因此,这并不意味着您获得的种子会在不同情况下与其他种子产生相同的结果。

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多