如何"stash" 随机状态生成器状态
How to "stash" random state generator state
我正在为随机数生成器播种以获得可重现的结果:
import random
SEED = 32412542
random.seed(SEED)
我想让它 return "non-reproducible" 只为程序的一部分设置随机值,如:
import random
SEED = 32412542
random.seed(SEED)
my_list = [1, 2, 3, 4, 5]
res = random.sample(my_list, len(my_list)) # I would like result of this to be the same between runs of the program.
# Do some reproducible calculations, such as training neural network.
print(res) # E.g. prints [3, 2, 4, 1, 5]
# What to do here?
res = random.sample(my_list, len(my_list)) # I would like result of this to be different between runs.
# Do some non-reproducible calculations, such as picking neural network parameters randomly.
print(res) # Prints some random order.
res = random.sample(my_list, len(my_list)) # I would like result of this to be the same between runs of the program.
# Do some reproducible calculations, such as training neural network.
print(res) # E.g. prints [2, 3, 1, 4, 5]
到目前为止我想出的是在我希望它变得不可复制之前不带参数播种,然后用 SEED
值重新播种:
import random
SEED = 32412542
random.seed(SEED)
my_list = [1, 2, 3, 4, 5]
res = random.sample(my_list, len(my_list))
print(res) # Prints: [3, 2, 4, 1, 5]
random.seed()
res = random.sample(my_list, len(my_list))
print(res) # Prints some random order.
random.seed(SEED)
res = random.sample(my_list, len(my_list))
print(res) # Prints: [3, 2, 4, 1, 5], so exactly what has been printed before.
问题是,在重新播种后,会产生完全相同的一组随机值(显然 - 最后这是用特定值播种的目的),我不想发生这种情况。我想以某种方式恢复随机生成器的先前状态。这可能吗?
您不能使用 random
函数执行此操作,但可以通过创建 Random
class 的实例来实现。 As the documentation states:
Class Random
can also be subclassed if you want to use a different
basic generator of your own devising: in that case, override the
random()
, seed()
, getstate()
, and setstate()
methods. Optionally, a
new generator can supply a getrandbits() method — this allows
randrange() to produce selections over an arbitrarily large range.
示例:
>>> import random
>>> r = random.Random()
>>> r.randint(1, 1000)
545
>>> r.randint(1, 1000)
349
>>> r.randint(1, 1000)
745
>>> r.randint(1, 1000)
792
>>> state = r.getstate()
>>> r.randint(1, 1000)
52
>>> r.randint(1, 1000)
799
>>> r.randint(1, 1000)
586
>>> r.randint(1, 1000)
581
>>> r.setstate(state)
>>> r.randint(1,1000)
52
>>> r.randint(1,1000)
799
>>> r.randint(1,1000)
586
>>> r.randint(1,1000)
581
其实you can even using the functions from the random
module,我的错:
random.getstate()
Return an object capturing the current internal
state of the generator. This object can be passed to setstate()
to
restore the state.
random.setstate(state)
state should have been obtained from a previous
call to getstate()
, and setstate()
restores the internal state of the
generator to what it was at the time getstate()
was called.
我正在为随机数生成器播种以获得可重现的结果:
import random
SEED = 32412542
random.seed(SEED)
我想让它 return "non-reproducible" 只为程序的一部分设置随机值,如:
import random
SEED = 32412542
random.seed(SEED)
my_list = [1, 2, 3, 4, 5]
res = random.sample(my_list, len(my_list)) # I would like result of this to be the same between runs of the program.
# Do some reproducible calculations, such as training neural network.
print(res) # E.g. prints [3, 2, 4, 1, 5]
# What to do here?
res = random.sample(my_list, len(my_list)) # I would like result of this to be different between runs.
# Do some non-reproducible calculations, such as picking neural network parameters randomly.
print(res) # Prints some random order.
res = random.sample(my_list, len(my_list)) # I would like result of this to be the same between runs of the program.
# Do some reproducible calculations, such as training neural network.
print(res) # E.g. prints [2, 3, 1, 4, 5]
到目前为止我想出的是在我希望它变得不可复制之前不带参数播种,然后用 SEED
值重新播种:
import random
SEED = 32412542
random.seed(SEED)
my_list = [1, 2, 3, 4, 5]
res = random.sample(my_list, len(my_list))
print(res) # Prints: [3, 2, 4, 1, 5]
random.seed()
res = random.sample(my_list, len(my_list))
print(res) # Prints some random order.
random.seed(SEED)
res = random.sample(my_list, len(my_list))
print(res) # Prints: [3, 2, 4, 1, 5], so exactly what has been printed before.
问题是,在重新播种后,会产生完全相同的一组随机值(显然 - 最后这是用特定值播种的目的),我不想发生这种情况。我想以某种方式恢复随机生成器的先前状态。这可能吗?
您不能使用 random
函数执行此操作,但可以通过创建 Random
class 的实例来实现。 As the documentation states:
Class
Random
can also be subclassed if you want to use a different basic generator of your own devising: in that case, override therandom()
,seed()
,getstate()
, andsetstate()
methods. Optionally, a new generator can supply a getrandbits() method — this allows randrange() to produce selections over an arbitrarily large range.
示例:
>>> import random
>>> r = random.Random()
>>> r.randint(1, 1000)
545
>>> r.randint(1, 1000)
349
>>> r.randint(1, 1000)
745
>>> r.randint(1, 1000)
792
>>> state = r.getstate()
>>> r.randint(1, 1000)
52
>>> r.randint(1, 1000)
799
>>> r.randint(1, 1000)
586
>>> r.randint(1, 1000)
581
>>> r.setstate(state)
>>> r.randint(1,1000)
52
>>> r.randint(1,1000)
799
>>> r.randint(1,1000)
586
>>> r.randint(1,1000)
581
其实you can even using the functions from the random
module,我的错:
random.getstate()
Return an object capturing the current internal state of the generator. This object can be passed tosetstate()
to restore the state.
random.setstate(state)
state should have been obtained from a previous call togetstate()
, andsetstate()
restores the internal state of the generator to what it was at the timegetstate()
was called.