【问题标题】:Get random seed in Rcpp在 Rcpp 中获取随机种子
【发布时间】:2021-12-18 03:45:42
【问题描述】:

我需要最小化一个函数,比如说f(theta)。在f(theta) 中,我从给定的分布中绘制了非常大的矩阵。所以,在整个优化过程中,我必须保持相同的矩阵。但是,由于矩阵太大,我无法保存它们。因此,对于theta 的每个值,我决定找到一种方法来绘制相同的矩阵。如果我定义一个种子,就可以做到这一点,每次调用函数时都会使用它。但我不希望用户设置种子,我需要软件获取当前种子,然后将该种子用于 theta 的每个新值。

如果我使用 R,这是一个简化示例。

f <- function(theta, SEED) {
  .Random.seed <- SEED
  # I simplify the problem, I replace the big matrices by a small vector
  return(sum((rnorm(10) - theta)^2))
}

optim(par = 0, fn = f, method = "Brent", lower = -1, upper = 1, SEED = .Random.seed)

.Random.seed 允许我获得将用于f 的种子。这确保了在优化期间,rnorm(10) 不会被更改,尽管它没有被保存。如何使用Rcpp 构造类似的函数?

【问题讨论】:

    标签: r rcpp random-seed rcpparmadillo


    【解决方案1】:

    Rcpp 已经为您处理了这个问题,并且(充分)记录在案。也就是说:

    > set.seed(42)
    > rnorm(3)
    [1]  1.370958 -0.564698  0.363128
    > rnorm(3)
    [1]  0.632863  0.404268 -0.106125
    > Rcpp::cppFunction("Rcpp::NumericVector myrn(int n) {return Rcpp::rnorm(3);}")
    > myrn(3)   # __not reseeded, different__
    [1]  1.511522 -0.094659  2.018424
    > set.seed(42)
    > myrn(3)   # reseeded, same as above from R
    [1]  1.370958 -0.564698  0.363128
    > myrn(3)   # ditto
    [1]  0.632863  0.404268 -0.106125
    > 
    

    在您调用您应该调用的函数set.seed() 后,您将在 R 和 C++ 中获得相同的绘图。所以在调用你的函数之前调用一个种子,一切都很好。

    【讨论】:

    • 谢谢德克。但这并不能解决问题。我必须在函数中设置种子,因为该函数将被 optim 调用多次。所以如果我之前设置了种子,当函数在 optim 中被多次调用时,我会得到不同的 rnorm 值。为了找到最小值,optim 将调用该函数以获得多个 theta 值。我需要绘制 rnorm() 当 f 将被调用为几个 theta 值时相同。
    • R 本身的 C API提供来自 C 的调用来设置种子。所以你正在射击信使。再花两分钟时间了解Rcpp::Function() 的文档(或示例),您就会意识到这不是问题,因为如果您确实需要,您可以从 C(++) 调用 R 函数。但是也许您应该简单地重新考虑您的问题,例如使用完全由 C++ 控制且独立于 R 的 不同 RNG。这完全取决于您,只有您可以决定,并且我们不会将任何工具远离您。
    猜你喜欢
    • 1970-01-01
    • 2018-06-17
    • 2019-11-03
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2016-08-12
    相关资源
    最近更新 更多