来自单个种子的多个独立随机数流

2024-06-14 00:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有n相似的分析,每个都使用m_i伪随机数流(m_i可能在不同的分析之间有所不同)。每个分析都有自己的随机数种子,这样随机数在分析之间是不相关的。在

我的问题是我需要从单个种子创建m_i流。分析目前是用Numpy编写的,所以它的Mersenne Twister的解决方案是理想的,但我对其他成熟库中的解决方案持开放态度。我考虑了这些可能性:

  1. 使用种子来创建一个随机数流,绘制m_i个整数,并将这些整数用作m_i随机流的种子。这并不好,因为birthday paradox。有2^32(~40亿)个种子,但是如果我在2^16(~60000)之后以碰撞(两个流以相同的种子开始)结束。

  2. 将每个流索引的某个常量m_max乘以1,得到该流的种子。(例如,对于seed=2和{},分析将使用种子20001、20002、20003等)。这是不可取的,因为在发生冲突之前,所有分析都将限制在m_max流中,如果{}太大,则分析的数量限制为2^32/m_max

  3. 使用种子创建一个随机数流,为每个需要的流绘制62432位integers,并将每个流的set the state转换为为为其绘制的624个整数。这似乎很完美,只是我不知道624个随机整数是否真的是Mersenne Twister的有效内部状态(可以是任意位吗?)。我也不知道整数之间是否有隐藏的关联(也许它们是同一个流,只是移动了624)。

有标准的方法吗?在


Tags: numpy绘制整数解决方案可能性种子maxseed
1条回答
网友
1楼 · 发布于 2024-06-14 00:20:32

方法3可以工作,因为任何PRNG的种子都可以与PRNG的状态一样长(例如,Mersenne Twister的状态长度为19968位,或624*32位,因此可以接受最多为多个位的种子-它不仅限于32位或64位,许多实现Mersenne Twister的api的实践也是如此)。然而,你应该使用一个与梅森捻线无关的设计的PRNG,如PCG,种子种子,然后绘制624整数种子,如你所建议。(或者,如果您不需要可重复的结果,或者如果您要保存这样生成的624个整数种子,您可以使用加密RNG,例如os.urandom()或{},来绘制这些种子。)My article on RNGs建议使用不同设计的几个prng。在


更新(2019年12月1日):

如果您使用的是NumPy,请注意,同时,NumPy 1.17引入了一个new random number generation system;它使用所谓的位生成器,如PCG,随机生成器,如新的numpy.random.Generator。这是proposal to change the RNG policy的结果。NumPy文档现在有关于seeding RNGs in parallelmultithreading RNGs的详细信息。我还有关于在“Seed Generation for Noncryptographic PRNGs”中植入多个进程(不是NumPy特定的)的一般信息

相关问题 更多 >