The short answer is that you simply can't (at least not in general).
The Mersenne Twister RNG used by numpy has 219937-1 possible internal states, whereas a single 64 bit integer has only 264 possible values. It's therefore impossible to map every RNG state to a unique integer seed.
You can get and set the internal state of the RNG directly using np.random.get_state
and np.random.set_state
. The output of get_state
is a tuple whose second element is a (624,)
array of 32 bit integers. This array has more than enough bits to represent every possible internal state of the RNG (2624 * 32 > 219937-1).
The tuple returned by get_state
can be used much like a seed in order to create reproducible sequences of random numbers. For example:
import numpy as np
# randomly initialize the RNG from some platform-dependent source of entropy
np.random.seed(None)
# get the initial state of the RNG
st0 = np.random.get_state()
# draw some random numbers
print(np.random.randint(0, 100, 10))
# [ 8 76 76 33 77 26 3 1 68 21]
# set the state back to what it was originally
np.random.set_state(st0)
# draw again
print(np.random.randint(0, 100, 10))
# [ 8 76 76 33 77 26 3 1 68 21]
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…