mardi 12 janvier 2021

Reset numpy random generator instance

I need independent random generator instances with the ability to reset.

For Python's built-in random generator I wrote the following class which is enough for my needs (if you have a better implementation, let me know):

from random import Random, random
class PyPRNG(Random):
    def __init__(self, seed=None):
        if seed is None:
            seed = random()
        self._seed = seed
        super().__init__(seed)
    def reset(self):
        self.seed(self._seed)

>>> a = PyPRNG(2021)
>>> a.random()
0.8363375023320742
>>> a.random()
0.8583024042081875
>>> a.reset()
>>> a.random()
0.8363375023320742

Now, I want to play with numpy's PRNG.

I couldn't find a 'seed'-equivalent method in numpy's Generator to implement the reset method.

SeedSequence was not so clear for me, so I did this:

from numpy.random import Generator, MT19937, PCG64, Philox, SFC64
class NumpyPRNG(Generator):
    def __init__(self, seed=None, bit_generator=MT19937):
        _bit_generator = bit_generator(seed)
        self._state = _bit_generator.state
        super().__init__(_bit_generator)
    def reset(self):
        self.bit_generator.state = self._state.copy()

>>> b = NumpyPRNG(2021, Philox)
>>> b.random()
0.2934718429185965
>>> b.random()
0.6752607814067463
>>> b.reset()
>>> b.random
0.2934718429185965

It works, but maybe you can point me to a better solution... ?




Aucun commentaire:

Enregistrer un commentaire