在python中生成多个独立的随机流

时间:2014-06-13 11:47:06

标签: python numpy random

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

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

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

有没有办法在Python中创建像RandStream这样的东西

4 个答案:

答案 0 :(得分:9)

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])

答案 1 :(得分:1)

您不需要使用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()

答案 2 :(得分:0)

Veedrac的答案没有解决人们可能如何生成独立流的问题。

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

它支持independent random streams,但是它们使用三种随机数生成器之一:PCG64,ThreeFry或Philox。如果要使用更传统的MT19937,则可以依靠jumping

答案 3 :(得分:0)

为了可重复性,您可以将种子直接传递到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