【发布时间】:2018-05-26 14:15:20
【问题描述】:
我在 R 中使用 replicate() 函数通过 Rcpp 函数生成随机数时遇到问题。考虑 R 中的以下函数:
trial <- function(){rnorm(1)}
replicate(10, trial())
它从高斯分布中生成 10 个随机数。它工作得很好,并产生如下结果:
[1] 0.7609912 -0.2949613 1.8684363 -0.3358377 -1.6043926 0.2706250 0.5528813 1.0228125 -0.2419092 -1.4761937
但是,我有一个 c++ 函数getRan(),它可以从高斯分布中生成一个随机数。我再次使用复制来调用这样的函数:
replicate(10,getRan())
它创建一个相同数字的向量,如下所示:
> replicate(10,getRan())
[1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
[1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
[1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
[1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
但是,如果我多次调用该函数,它工作正常:
getRan()
[1] 1.345227
> getRan()
[1] 0.3555393
> getRan()
[1] 1.587241
> getRan()
[1] 0.5313518
那么这里的问题是什么? replicate() 函数是否重复从 getRan() 返回的相同函数,而不是多次调用 getRan()?是bug吗?
PS:我知道我可以使用rnorm(n)来生成n个正常的随机数,但是,我想使用c++函数在生成随机数的基础上进行更复杂的计算
PPS:这是我的 C++ 代码:
double getRan(){
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator(seed);
std::normal_distribution<double> distribution (0.0,1.0);
double epi = distribution(generator);
return epi;
}
【问题讨论】:
-
有趣。你能检查一下如果你做
lapply(1:10, getRan)会发生什么吗?我怀疑这与replicate的表达有关,但除此之外我不确定...... -
发布一个可重现的示例。到目前为止,这只是一个(可能是善意的,但仍然没用的)咆哮......
-
我的水晶球告诉我,在您的 C++ 中,RNG 是用相同的种子实例化的。如需更多信息,我们需要minimal reproducible example。
-
@dash2 它产生:> lapply(1:10,getRan) FUN(X[[i]], ...) 中的错误:未使用的参数 (X[[i]])跨度>
-
@RalfStubner,谢谢,我也意识到了同样的事情,我用时间作为种子,所以当用复制()调用函数时,种子是一样的,我想知道如何解决它,这是我的 C++ 代码:
double getRan(){ unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::default_random_engine generator(seed); std::normal_distribution<double> distribution (0.0,1.0); double epi = distribution(generator); return epi; }