【问题标题】:Random Numbers in R and C++R 和 C++ 中的随机数
【发布时间】:2016-06-19 00:07:25
【问题描述】:

假设我想生成一个包含 10 个随机数的向量。我怎样才能在 R 和 c++ 中这样做,以便获得相同的向量?

我知道在 C++ 中我必须使用 srand() 然后 rand() 而在 R 中,我可以使用 set.seed() 然后 runif。

但是我怎样才能让它们相同呢?

【问题讨论】:

  • “我知道在 C++ 中我必须使用 srand() 然后使用 rand()” - 如果你想要高质量的随机数,则不是......
  • 对于 C++11,您应该查看 <random> 而不是 std::randcplusplus.com/reference/random

标签: c++ r random-sample


【解决方案1】:

如果您使用 R 的 C API - 或者更好的是,基于它构建的 C++ 的 Rcpp 接口 - 那么您可以轻松访问 相同的 strong> 来自同一个生成器的流。

R> library(Rcpp)    # load Rcpp
R> cppFunction("NumericVector myrnorm(int n) { return rnorm(n); }")
R> # now we have a C++ function access n N(0,1) numbers
R> set.seed(41); myrnorm(3)
[1] -0.794368  0.197258  1.001704
R> 
R> # same thing in R
R> set.seed(41)
R> rnorm(3)
[1] -0.794368  0.197258  1.001704
R> 

您注意到,在给定相同种子的情况下,它们都生成相同的数字。这是一项功能

现在,您还可以将自己的 RNG 生成器从 C++ 代码引入 R。我这样做,例如在RcppZiggurat package 其中is also on CRAN

【讨论】:

  • 我相信这就是我想要的。我将如何实现它?
  • 我刚刚给你看了。对于其余部分,以及更多示例,请参阅 Rcpp 文档。
  • 我可以走另一条路吗?我有一个设置的 R 代码,但我需要在 C++ 中复制。那么我将如何在 c++ 中编写 lbirary(Rcpp)
  • 两种选择:RInside,或使用Rmathlib 库,可选择从 R 源代码构建,其中包含函数子集,但包括 RNG。
  • 我如何能够在 c++ 中实现这一点。我不允许更改 R 代码。
【解决方案2】:

几件事,我不确定您是想构建一个独立的应用程序还是只是将 C++ 代码与 R 接口。

如果是后者,只需将Rcpp 的包装器加入r 支持的发行版列表即可。

例如

R::runif(0.0,1.0) 或使用糖Rcpp::runif(10, 0.0, 1.0)

如果是先验,请查看 sitmo 以及如何实现自己的 runif

【讨论】:

  • 为什么投反对票?答案和我的差不多,没有例子。我们基本上是同时写的。
【解决方案3】:

随机数生成器的整体理念是结果不可预测或不可重现。如果您期望来自两个独立系统的相同输出,例如在 R 和 C++ 中实现,依赖于实现中未记录的弱点。

不明白你为什么要尝试这个。

你想要“一个”向量。假设这意味着“一”,为什么不将一些数字保存在 TXT 文件中并让 R 和 C++ 应用程序都从该文件中读取呢?

我不会依赖随机数生成器的任何可预测结果。不能保证调用 RAND 或 RND 或任何库函数的两个 C++ 编程环境将获得相同的数字,更不用说 R 和 C++ 应用程序了。他们可能会调用不同版本的 RAND ...

【讨论】:

  • 好吧,我的目标是尝试在 C++ 中复制一个 r 项目,但 r 项目在其实现中具有随机性
  • 好的,只需按照 Dirk 的回答:在两种语言中使用您自己的(随机)数字生成器代码。随机性在您的问题中不是必不可少的,因此请用确定性替换它
  • @jenesaisquoi 你越来越哲学了。我一直认为您应该使用“随机”种子来避免从伪(=非)随机序列的可预测开始处开始。种子可以派生,例如来自时间戳。
猜你喜欢
  • 2014-08-19
  • 2021-04-12
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2011-01-27
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多