在Rcpp中使用gsl_ran_multinomial生成多项分布变量出错求助
问题:GSL多项分布抽样结果异常的排查与解决
我尝试高效生成多项分布随机变量,选用gsl_ran_multinomial实现,但参考相关内容后,结果始终不符合预期。
我的实现代码
// [[Rcpp::export]] arma::ivec rmvn_gsl(int K, arma::vec prob) { gsl_rng *s = gsl_rng_alloc(gsl_rng_mt19937); // Create RNG seed arma::ivec temp(K); gsl_ran_multinomial(s, K, 1, prob.begin(), (unsigned int *) temp.begin()); gsl_rng_free(s); // Free memory return temp; }
运行结果示例
rmvn_gsl(3, c(0.2, 0.7, 0.1)) [,1] [1,] 1 [2,] 0 [3,] 0
上述结果明显不符合给定概率分布,想确认代码是否存在问题,求助解决。
更新:问题解决与后续选择
核心问题是未设置随机种子,GSL有默认固定种子,导致每次抽样结果一致。设置基于时间的种子后代码可正常运行。但经微基准测试,rmultinom速度更快,因此最终选择使用rmultinom。同时感谢相关示例提供者的优秀实现参考,同类问题需注意随机种子的设置。
内容的提问来源于stack exchange,提问作者dywu0106
相关产品推荐
相关产品推荐

