我想在python中生成多个随机数流。 我正在编写一个用于模拟队列系统的程序,并希望有一个流用于到达间隔时间,另一个流用于服务时间等等。
numpy.random()
从全局流中生成随机数。
在matlab中有something called RandStream,这使我能够创建多个流。
有没有办法在Python中创建像RandStream这样的东西
答案 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