我正在使用Python构建蒙特卡罗模拟,并且迄今为止一直在使用NumPy生成我的随机变量。然而,我刚刚了解到NumPy使用Mersenne Twister算法来产生其随机数,根据我有限的理解,在蒙特卡罗模拟中这是不可取的。我更喜欢使用MRG32k3a,但我也想利用NumPy的分布函数。有没有办法让NumPy使用我选择的生成器,或者是否有另一个库可以给我相同的功能并提供使用我喜欢的生成器的选项?
为什么不自己用Python编写代码呢?
我在http://simul.iro.umontreal.ca/rng/MRG32k3a.c找到了该算法的一个示例实现(还有许多其他实现在http://www-labs.iro.umontreal.ca/~simul/rng上)。
如果你担心速度问题(但请先进行性能分析!),你可以使用CFFI、f2py等将C或F代码封装起来,并直接从Python中调用它 - 参见例如:
https://scipy-lectures.org/advanced/interfacing_with_c/interfacing_with_c.html
但考虑到这只是几行C代码,用Python编写应该不会太具有挑战性,对吧?
您也可以在https://github.com/bashtage/randomgen上提交拉取请求(或者礼貌地要求作者包含您选择的生成器)。
很抱歉这不能满足您对分布的需求,但也许这是一个开始,更好的答案将出现。
还有,请尝试弄清楚为什么梅森素数对您自己的目的无用-您测试过它吗?您使用什么指标来决定?
https://scicomp.stackexchange.com/questions/23547/parallel-mersenne-twister-for-monte-carlo可能对您有所帮助。
您能做一些预计算吗?
希望这能在某种程度上有所帮助。