在同一程序中植入random和numpy.random的最佳实践 - python

为了进行随机模拟,我们以后可重复运行,我和我的同事经常使用randomnumpy.random方法显式地为random.seednp.random.seed模块的随机数生成器添加种子。如果仅在程序中使用其中一个模块,则可以使用任意常量(例如42)进行播种,但是有时在同一程序中同时使用randomnp.random即可。我不确定在将两个RNG一起植入种子方面是否应该遵循最佳实践。

特别是,我担心存在某种陷阱,我们可能会陷入两个RNG一起以“非随机”方式表现的陷阱,例如both generating the exact same sequence of random numbers,或者一个序列在另一个序列后面跟随一些值(例如random中的第k个数字始终是np.random中的第k + 20个数字),或者两个序列以某种其他数学方式彼此关联。 (我意识到伪随机数生成器都不是对真实随机性的完美模拟,但我想避免因种子选择不当而加剧这种情况。)

考虑到这一目标,我们是否应该或不应该为这两种RNG注入种子?我曾经或曾经见过同事使用一些不同的策略,例如:

使用相同的任意种子:

random.seed(42)
np.random.seed(42)

使用两个不同的任意种子:

random.seed(271828)
np.random.seed(314159)

使用来自一个RNG的随机数来播种另一个:

random.seed(42)
np.random.seed(random.randint(0, 2**32))

...而且我从没注意到这些方法带来的任何奇怪结果...但是也许我只是想念它们。有官方的方法吗?在代码审查中是否可以发现任何陷阱并引发警报?

python参考方案

我将讨论一些有关如何播种多个伪随机数生成器(PRNG)的准则。我假设您不是出于信息安全目的使用随机数(如果您这样做,则仅适合使用加密RNG,并且此建议不适用)。

为了降低相关随机数的风险,您可以使用PRNG算法,例如SFC和其他所谓的“基于计数器”的PRNG(Salmon等人,“并行随机数:1、2、3一样简单, 2011年),支持独立的随机“流”。还有其他策略,我将在“ Seeding Multiple Processes”中对此进行详细说明。
如果可以使用NumPy 1.17,请注意该版本引入了新的PRNG系统,并在其PRNG清单中添加了SFC(SFC64)。有关并行随机生成的特定于NumPy的建议,请参阅NumPy文档中的“ Parallel Random Number Generation”。
您应该避免在时间戳上植入PRNG(尤其是一次)。
当我开始编写此答案时,您在评论中提到了this question。此处的建议不要播种同一种PRNG的多个实例。但是,如果选择不相互关联的种子,或者状态非常大的PRNG(例如Mersenne Twister)或给每个种子提供自己的不重叠随机数的PRNG,则此建议的适用范围不大使用顺序(例如SFC)。此处已接受的答案(在撰写本文时)演示了使用具有顺序种子的.NET的System.Random的多个实例时发生的情况,但不一定是不同设计的PRNG,多个设计的PRNG或PRNG用不相关的种子初始化。而且,.NET的System.Random对于PRNG来说不是一个不错的选择,因为它只允许种子长度不超过32位(因此它可以产生的随机序列数是有限的),并且还存在实现错误(如果我正确理解),以保持向后兼容性。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

使用float可以安全播种Python RNG吗? - python

浮点值可以作为参数传递给random.seed()吗?这会带来无法预料的问题吗?换一种说法。是...random.seed(0.99999999) <use a few thousand random numbers> random.seed(1) <use a few thousand random numbers> ....在功能…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…