random.seed(): What does it do?
我对
1 2 3 4 5 6 7 8 9 10 11 12 | >>> import random >>> random.seed(9001) >>> random.randint(1, 10) 1 >>> random.randint(1, 10) 3 >>> random.randint(1, 10) 6 >>> random.randint(1, 10) 6 >>> random.randint(1, 10) 7 |
我找不到关于此的好的文档。
伪随机数生成器通过对值执行某些运算来工作。通常,此值是生成器生成的先前数字。但是,第一次使用生成器时,没有先前的值。
播种伪随机数生成器会为其赋予第一个"上一个"值。每个种子值将对应于给定随机数生成器的一系列生成值。也就是说,如果两次提供相同的种子,则两次获得相同的数字序列。
通常,您希望为随机数生成器添加一些值,这些值将更改程序的每次执行。例如,当前时间是一个经常使用的种子。之所以不会自动发生,是因为您可以根据需要提供特定的种子来获得已知的数字序列。
所有其他答案似乎都无法解释random.seed()的用法。
这是一个简单的示例(源):
1 2 3 4 5 6 | import random random.seed( 3 ) print"Random number with seed 3 :", random.random() #will generate a random number #if you want to use the same random number once again in your program random.seed( 3 ) random.random() # same random number as before |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> random.seed(9001) >>> random.randint(1, 10) 1 >>> random.seed(9001) >>> random.randint(1, 10) 1 >>> random.seed(9001) >>> random.randint(1, 10) 1 >>> random.seed(9001) >>> random.randint(1, 10) 1 >>> random.seed(9002) >>> random.randint(1, 10) 3 |
你试试这个。假设" random.seed"为随机值生成器(" random.randint()")提供了一个值,该值根据该种子生成这些值。随机数的必须属性之一是它们应具有可重现性。放入相同的种子后,您将获得相同的随机数模式。因此,您可以从头开始重新生成它们。您给其他种子以不同的首字母开头(3以上)。
现在,您已经提供了一个种子,它将一个接一个地生成1到10之间的随机数。因此,您可以为一个种子值假设一组数字。
通过对先前值进行某些运算会生成一个随机数。
如果没有先前的值,那么当前时间将自动作为先前的值。我们可以使用
因此,
1 2 3 4 5 6 7 8 9 10 11 | import random random.seed(45) #seed=45 random.random() #1st rand value=0.2718754143840908 0.2718754143840908 random.random() #2nd rand value=0.48802820785090784 0.48802820785090784 random.seed(45) # again reasign seed=45 random.random() 0.2718754143840908 #matching with 1st rand value random.random() 0.48802820785090784 #matching with 2nd rand value |
因此,生成随机数实际上不是随机的,因为它运行在算法上。算法总是基于相同的输入给出相同的输出。这意味着,它取决于种子的价值。因此,为了使其更具随机性,时间会自动分配给
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Seed() can be used for later use --- Example: >>> import numpy as np >>> np.random.seed(12) >>> np.random.rand(4) array([0.15416284, 0.7400497 , 0.26331502, 0.53373939]) >>> >>> >>> np.random.seed(10) >>> np.random.rand(4) array([0.77132064, 0.02075195, 0.63364823, 0.74880388]) >>> >>> >>> np.random.seed(12) # When you use same seed as before you will get same random output as before >>> np.random.rand(4) array([0.15416284, 0.7400497 , 0.26331502, 0.53373939]) >>> >>> >>> np.random.seed(10) >>> np.random.rand(4) array([0.77132064, 0.02075195, 0.63364823, 0.74880388]) >>> |
1 2 3 4 5 6 7 8 | # Simple Python program to understand random.seed() importance import random random.seed(10) for i in range(5): print(random.randint(1, 100)) |
多次执行以上程序...
第一次尝试:打印1到100范围内的5个随机整数
第二次尝试:打印出与上述执行中相同的5个随机数。
第三次尝试:相同
.....等等
说明:每次运行上述程序时,我们都将seed设置为10,然后随机数生成器将其作为参考变量。然后通过执行一些预定义的公式,它会生成一个随机数。
因此,在下一次执行中将种子设置为10再次将引用号设置为10,并且同样的行为再次开始...
一旦我们重置种子值,它就会得到相同的植物。
注意:更改种子值并运行程序,您将看到与前一个不同的随机序列。
在这种情况下,随机实际上是伪随机。给定种子,它将生成具有相等分布的数字。但是使用相同的种子,每次都会生成相同的数字序列。如果要更改它,则必须更改种子。很多人喜欢根据当前时间或某物生成种子。
恕我直言,当您再次使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | In [47]: random.randint(7,10) Out[47]: 9 In [48]: random.randint(7,10) Out[48]: 9 In [49]: random.randint(7,10) Out[49]: 7 In [50]: random.randint(7,10) Out[50]: 10 In [51]: random.seed(5) In [52]: random.randint(7,10) Out[52]: 9 In [53]: random.seed(5) In [54]: random.randint(7,10) Out[54]: 9 |
在生成一组随机数之前设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> from random import * >>> seed(20) >>> randint(1,100) 93 >>> randint(1,100) 88 >>> randint(1,100) 99 >>> seed(20) >>> randint(1,100) 93 >>> randint(1,100) 88 >>> randint(1,100) 99 >>> |
这是我的理解。
每次设置种子值时,都会生成一个"标签"或"引用"。下一个random.function调用将附加到此"标签",因此,下次您调用相同的种子值和random.function时,它将获得相同的结果。
1 2 3 4 5 6 7 8 | np.random.seed( 3 ) print(np.random.randn()) # output: 1.7886284734303186 np.random.seed( 3 ) print(np.random.rand()) # different function. output: 0.5507979025745755 np.random.seed( 5 ) print(np.random.rand()) # different seed value. output: 0.22199317108973948 |
这是一个小测试,演示用相同的参数输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # testing random.seed() import random def equalityCheck(l): state=None x=l[0] for i in l: if i!=x: state=False break else: state=True return state l=[] for i in range(1000): random.seed(10) l.append(random.random()) print"All elements in l are equal?",equalityCheck(l) |
python中的
PRNG是一种生成近似随机数属性的数字序列的算法。可以使用种子值来复制这些随机数。因此,如果提供种子值,则PRNG使用种子从任意的起始状态开始。
参数
1 2 3 4 | import random random.seed(9001) random.randint(1, 10) #this gives output of 1 # 1 |
如果要复制相同的随机数,请再次提供相同的种子
1 2 3 | random.seed(9001) random.randint(1, 10) # this will give the same output of 1 # 1 |
如果您不提供种子,那么它将生成不同的数字,而不是以前的1
1 2 | random.randint(1, 10) # this gives 7 without providing seed # 7 |
如果您提供的种子比以前有所不同,那么它将为您提供不同的随机数
1 2 3 | random.seed(9002) random.randint(1, 10) # this gives you 5 not 1 # 5 |
因此,总而言之,如果要复制相同的随机数,请提供种子。具体来说,是相同的种子。