【问题标题】:Generate multiple independent random streams in python在python中生成多个独立的随机流
【发布时间】:2014-08-03 23:16:16
【问题描述】:

我想在 python 中生成多个随机数流。 我正在编写一个模拟队列系统的程序,并希望一个流用于到达间隔时间,另一个流用于服务时间等等。

numpy.random() 从全局流中生成随机数。

在 matlab 中有 something called RandStream,它使我能够创建多个流。

有什么方法可以在 Python 中创建类似 RandStream 的东西

【问题讨论】:

  • 您是否打算这样做以减少差异?

标签: python numpy random


【解决方案1】:

Numpy 和内部随机生成器都有可实例化的类。

仅适用于random

import random
random_generator = random.Random()
random_generator.random()
#>>> 0.9493959884174072

对于 Numpy:

import numpy
random_generator = numpy.random.RandomState()
random_generator.uniform(0, 1, 10)
#>>> array([ 0.98992857,  0.83503764,  0.00337241,  0.76597264,  0.61333436,
#>>>         0.0916262 ,  0.52129459,  0.44857548,  0.86692693,  0.21150068])

【讨论】:

  • 我在哪里可以找到第一个文档?我似乎无法正确地谷歌它......
  • @Atcold "此模块提供的函数实际上是random.Random 类的隐藏实例的绑定方法。您可以实例化自己的Random 实例以获得不共享的生成器状态。” - docs.python.org/3/library/random.html
  • 但是如何生成独立的流呢?连续的种子能保证工作吗?
  • @RafaelAlmeida 这是一个病态的例子,有几个原因在这里不适用。 1)我们只生成两个序列,因此序列将快速去相关,而不是从许多连续序列中提取一个样本,2)Python 的播种有一个哈希步骤来修复相关性,3)你永远不会获得理想的独立性无论如何,来自像 Mersenne Twister 这样的平庸发电机;如果有问题,请使用更好的 RNG(最好是加密的)并且不要使用固定种子。我同意使用更大的高熵种子更能规避风险。
  • @RafaelAlmeida 值得注意的是,C# 似乎在使用减法生成器,看起来很垃圾。
【解决方案2】:

Veedrac 的回答没有说​​明如何生成独立的流。

我能找到生成独立流的最佳方法是使用 numpy 的 RandomState 的替代品。这是由RandomGen package 提供的。

它支持independent random streams,但它们使用三个随机数生成器之一:PCG64、ThreeFry 或 Philox。如果您想使用更传统的 MT19937,您可以改用jumping

【讨论】:

  • random.Random() 一个独立的流,至少达到 Mersenne Twister 的极限。如果您需要n 流,请执行[random.Random() for _ in range(n)]
【解决方案3】:

您不需要使用 RandomGen 包。只需启动两个流就足够了。例如:

import numpy as np
prng1 = np.random.RandomState()
prng2 = np.random.RandomState()
prng1.seed(1)
prng2.seed(1)

现在,如果您使用prngX.rand() 对两个流进行处理,您会发现这两个流将给您相同的结果,这意味着它们是具有相同种子的独立流。

要使用random 包,只需将np.random.RandomState() 替换为random.Random()

【讨论】:

    【解决方案4】:

    为了重现性,您可以将种子直接传递给random.Random(),然后从那里调用变量。然后每个启动的实例将独立于另一个运行。例如,如果您运行:

    import random
    rg1 = random.Random(1)
    rg2 = random.Random(2)
    rg3 = random.Random(1)
    for i in range(5): print(rg1.random())
    print('')
    for i in range(5): print(rg2.random())
    print('')
    for i in range(5): print(rg3.random())
    

    你会得到:

    0.134364244112
    0.847433736937
    0.763774618977
    0.255069025739
    0.495435087092
    
    0.956034271889
    0.947827487059
    0.0565513677268
    0.0848719951589
    0.835498878129
    
    0.134364244112
    0.847433736937
    0.763774618977
    0.255069025739
    0.495435087092
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多