蒙特卡洛积分中,std::mt19937跳过生成步骤能否优化分布?
蒙特卡洛积分中std::mt19937跳过随机数生成步骤提升精度的问题
我正在开发一款蒙特卡洛积分程序,采用std::mt19937作为随机数生成器。核心逻辑如下:
long long result = 0; std::mt19937 rng(std::random_device()()); while (/*continue*/) { result += f(rng()); // 执行计算 // for (int i = 0; i < 30; i++) rng(); // 跳过生成步骤 } // 其他计算逻辑
在样本数量固定的前提下,取消注释“跳过生成步骤”的代码后,蒙特卡洛估计的精度明显提升;进一步将跳过次数从30次增加到50次,误差会进一步降低。这些跳过的步骤会改变生成器的内部状态,但这样操作真的能让随机数分布更优吗?更换种子后,该现象依然存在。想了解是否有开发者遇到过类似情况,期待相关建议。
更新
按照建议尝试使用std::seed_seq为std::mt19937播种,发现此前生成器未被正确初始化,且因多线程使用多个生成器,不良的播种方式才是导致“精度”问题的根源。相关内容可参考cppreference上的std::seed_seq文档及用法讨论。感谢所有提供帮助的人,收获良多。
内容的提问来源于stack exchange,提问作者JCut
相关产品推荐
相关产品推荐

