Mina Edward
Mina Edward

Reputation: 129

Generate multiple independent random streams in python

I want to generate multiple streams of random numbers in python. I am writing a program for simulating queues system and want one stream for the inter-arrival time and another stream for the service time and so on.

numpy.random() generates random numbers from a global stream.

In matlab there is something called RandStream which enables me to create multiple streams.

Is there any way to create something like RandStream in Python

Upvotes: 11

Views: 9294

Answers (5)

Anand kumar
Anand kumar

Reputation: 11

numpy added feature to generate independent streams of Random Numbers using SeedSequence. This process a user-provided seed, typically as an integer of some size, and to convert it into an initial state for a BitGenerator. It uses hashing techniques to ensure that low-quality seeds are turned into high quality initial states (at least, with very high probability).

from numpy.random import SeedSequence, default_rng

ss = SeedSequence(12345)

# Spawn off 10 child SeedSequences to pass to child processes.
child_seeds = ss.spawn(10)
streams = [default_rng(s) for s in child_seeds]

each stream is PCG64 generator. Random numbers can be generated sequentially as follows -

for i in 1:K
    instance[i] = [s.uniform() for s in streams]

There are more ways to generate independent streams of random numbers, check numpydocs.

Upvotes: 0

Cão
Cão

Reputation: 641

For the sake of reproducibility you can pass a seed directly to random.Random() and then call variables from there. Each initiated instance would then run independently from the other. For example, if you run:

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

You'll get:

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

Upvotes: 1

6etacat
6etacat

Reputation: 81

You do not need to use the RandomGen package. Simply initiate two streams would suffice. For example:

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

Now if you progress both streams using prngX.rand(), you will find that the two streams will give you identical results, which means they are independent streams with the same seed.

To use the random package, simply swap out np.random.RandomState() for random.Random().

Upvotes: 2

Praveen
Praveen

Reputation: 7222

Veedrac's answer did not address how one might generate independent streams.

The best way I could find to generate independent streams is to use a replacement for numpy's RandomState. This is provided by the RandomGen package.

It supports independent random streams, but these use one of three random number generators: PCG64, ThreeFry or Philox. If you want to use the more conventional MT19937, you can rely on jumping instead.

Upvotes: 0

Veedrac
Veedrac

Reputation: 60137

Both Numpy and the internal random generators have instantiatable classes.

For just random:

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

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

Upvotes: 18

Related Questions