【发布时间】:2017-05-30 02:57:38
【问题描述】:
我有一个函数和一个子函数,并且在每个函数中都生成了一些随机数组。为了使结果可重现,我使用种子。但是我看到了奇怪的情况。
当我在子函数中有一个种子时,主函数中的随机数也会受到子函数中的种子的影响。而且,从主功能到子功能没有这样的效果。 例如,考虑以下代码。
import random
from random import randint
import numpy as np
def randgene():
a=np.random.randint(0,5,size=5)
print "a in function", a
np.random.seed(seed=15)
b=np.random.randint(0,5,size=5)
print "b in function", b
d=np.random.choice(50, size=5, replace = False)
print "d in function", d
# np.random.seed(seed=None)
def main():
print "d-without seed", np.random.choice(50, size=5, replace = False)
print "a-without seed", np.random.randint(0,5,size=5)
print "b-without seed", np.random.randint(0,5,size=5)
f = randgene()
print "d-without seed", np.random.choice(50, size=5, replace = False)
print "a-without seed", np.random.randint(0,5,size=5)
print "b-without seed", np.random.randint(0,5,size=5)
f = randgene()
print "d-without seed", np.random.choice(50, size=5, replace = False)
print "a-without seed", np.random.randint(0,5,size=5)
print "b-without seed", np.random.randint(0,5,size=5)
np.random.seed(seed=10)
print "d-with seed", np.random.choice(50, size=5, replace = False)
print "a-with seed", np.random.randint(0,5,size=5)
print "b-with seed", np.random.randint(0,5,size=5)
f = randgene()
print "d-with seed", np.random.choice(50, size=5, replace = False)
print "a-with seed", np.random.randint(0,5,size=5)
f = randgene()
print "d-with seed", np.random.choice(50, size=5, replace = False)
print "a-with seed", np.random.randint(0,5,size=5)
if __name__ == '__main__':
main()
对于这段代码,我得到了这个结果:
d-without seed [14 29 9 42 18]
a-without seed [3 0 0 3 4]
b-without seed [3 2 0 2 1]
a in function [2 3 1 2 3]
b in function [0 4 0 4 3]
d in function [41 16 22 24 14]
d-without seed [ 8 21 32 39 11]
a-without seed [3 0 3 3 0]
b-without seed [1 2 2 1 4]
a in function [4 4 0 2 2]
b in function [0 4 0 4 3]
d in function [41 16 22 24 14]
d-without seed [ 8 21 32 39 11]
a-without seed [3 0 3 3 0]
b-without seed [1 2 2 1 4]
d-with seed [37 23 44 42 47]
a-with seed [2 0 0 4 4]
b-with seed [0 0 2 4 2]
a in function [0 0 2 3 0]
b in function [0 4 0 4 3]
d in function [41 16 22 24 14]
d-with seed [ 8 21 32 39 11]
a-with seed [3 0 3 3 0]
a in function [1 2 2 1 4]
b in function [0 4 0 4 3]
d in function [41 16 22 24 14]
d-with seed [ 8 21 32 39 11]
a-with seed [3 0 3 3 0]
每当我调用子函数时,您都会看到 d-with seed [ 8 21 32 39 11], a-with seed [3 0 3 3 0]
在主函数中重复出现。
但是,如果我在子函数中注释 np.random.seed(seed=15) 行,我会得到以下结果:
d-without seed [17 20 23 36 28]
a-without seed [3 1 1 2 0]
b-without seed [3 2 1 1 3]
a in function [1 2 2 0 4]
b in function [4 4 0 4 2]
d in function [ 9 46 19 7 47]
d-without seed [39 42 10 17 4]
a-without seed [2 3 0 2 4]
b-without seed [1 4 1 3 2]
a in function [1 1 3 3 2]
b in function [1 3 4 4 3]
d in function [ 0 2 45 5 19]
d-without seed [24 20 47 3 29]
a-without seed [3 0 3 3 3]
b-without seed [1 0 0 2 3]
d-with seed [37 23 44 42 47]
a-with seed [2 0 0 4 4]
b-with seed [0 0 2 4 2]
a in function [0 0 2 3 0]
b in function [4 4 0 1 1]
d in function [ 6 11 35 4 7]
d-with seed [19 47 43 38 15]
a-with seed [0 4 2 1 2]
a in function [1 2 1 3 2]
b in function [3 4 4 0 2]
d in function [38 31 17 43 2]
d-with seed [ 7 15 39 2 49]
a-with seed [3 4 1 4 0]
显然没有重复。因此,主函数中的种子对子函数没有影响。
如果我保留 np.random.seed(seed=15) 和 np.random.seed(seed=None) 未注释,我会得到类似的结果。
有人可以解释一下发生了什么吗?
提前致谢, 阿夫辛
【问题讨论】:
-
种子影响所有生成的随机数之后它被设置,无论在哪里。
-
@DYZ 谢谢,我明白了。
标签: python seed random-seed