如何在numpy中指定随机数生成器

4
我正在使用Python构建蒙特卡罗模拟,并且迄今为止一直在使用NumPy生成我的随机变量。然而,我刚刚了解到NumPy使用Mersenne Twister算法来产生其随机数,根据我有限的理解,在蒙特卡罗模拟中这是不可取的。我更喜欢使用MRG32k3a,但我也想利用NumPy的分布函数。有没有办法让NumPy使用我选择的生成器,或者是否有另一个库可以给我相同的功能并提供使用我喜欢的生成器的选项?

1
也许你可以看一下这个 https://pypi.org/project/randomstate ,它说它包含MRG32k3a。 - Kays Kadhi
1
根据我的有限理解,这在蒙特卡罗模拟中并不理想。我不确定你为什么认为这是正确的。机器翻译在许多情况下都很好。无论如何,如果你想要替代方案,请看一下https://github.com/bashtage/randomgen。 - Severin Pappadeux
1
谢谢你们两位的帮助。Severin,这是我正在参加的蒙特卡罗模拟课程的教练说的(我正在构建的模拟与此无关),他在课堂上说MT对大多数目的都很好,但可能不适用于蒙特卡罗模拟。维基百科页面支持这一点 https://en.wikipedia.org/wiki/Mersenne_Twister#cite_note-39 ,虽然似乎有方法可以解决出现的问题,但我不确定numpy是否自动使用这些解决方法,因此替换掉似乎是最直接的路线。 - Nathan Geldner
如果这确实对OP有用,请@KaysKadhi将其提交为更好的答案。 - jtlz2
1个回答

1

为什么不自己用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可能对您有所帮助。

您能做一些预计算吗?

希望这能在某种程度上有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接