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
class PyPRNG(Random):
def __init__(self, seed=None):
super().__init__(seed)
self._state = self.getstate()
def reset(self):
self.setstate(self._state)
>>> 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 am not sure about how to implement reset. SeedSequence
was not so clear for me.
Finally 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... ?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…