random.seed():它做什么?

我对random.seed()在Python中的作用有点困惑。例如,为什么下面的试验会(始终如一地)做它们所做的事情?

>>> 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

我找不到关于这方面的好的文件。

403075 次浏览

在这种情况下,随机实际上是伪随机。给定一颗种子,它将产生具有均匀分布的数字。但是使用相同的种子,它每次都会生成相同的数字序列。如果你想改变它,你就必须改变你的种子。很多人喜欢根据当前时间或其他东西来生成种子。

伪随机数生成器通过对值执行一些操作来工作。通常这个值是生成器生成的前一个数字。但是,第一次使用生成器时,没有以前的值。

播种一个伪随机数生成器会给它第一个“前一个”值。每个种子值将对应于给定随机数生成器的生成值序列。也就是说,如果你提供相同的种子两次,你会得到相同的数字序列两次。

通常,您希望为随机数生成器设置一些值,这些值将改变程序的每次执行。例如,当前时间是一个常用的种子。这不会自动发生的原因是,如果您愿意,您可以提供一个特定的种子来获得已知的数字序列。

所有其他答案似乎都不能解释random.seed()的使用。 下面是一个简单的例子():

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

下面是一个小测试,演示了给seed()方法提供相同的参数将导致相同的伪随机结果:

# 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)
>>> 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

你试试这个。

我们说“随机”。Seed '将一个值提供给随机值生成器('random.randint()'),该生成器根据该种子生成这些值。随机数的一个必备属性是它们应该是可重复的。当你放入相同的种子,你会得到相同的随机数模式。通过这种方式,您可以从一开始就生成它们。你给出一个不同的种子——它以不同的首字母开始(上面3)。

给定一个种子,它会一个接一个地生成1到10之间的随机数。假设一个种子值有一组数字。

恕我直言,当你再次使用random.seed(samedigit)时,它被用于生成相同的随机课程结果。

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
# Simple Python program to understand random.seed() importance


import random


random.seed(10)


for i in range(5):
print(random.randint(1, 100))

多次执行上面的程序…

第一次尝试:输出5个范围为1 ~ 100的随机整数

第二次尝试:打印相同的5个随机数字出现在上面的执行。

第三次尝试:相同

…等等

解释:每次运行上述程序时,我们都将seed设置为10,然后随机生成器将其作为参考变量。然后用一些预定义的公式,生成一个随机数。

因此,在下次执行时将seed设置为10,再次将引用号设置为10,然后再次启动相同的行为…

只要我们重置种子值,它就会给出相同的植物。

注意:改变种子值并运行程序,你会看到一个与前一个不同的随机序列。

以下是我的理解。 每当我们设置一个种子值时,就会生成一个“标签”或“引用”。下一个随机。函数调用被附加到这个“标签”,所以下次你调用相同的种子值和随机。函数,它会给你相同的结果
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
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])
>>>

随机数是通过对前一个值进行操作生成的。

如果没有之前的值,则当前时间将自动作为之前的值。我们可以自己使用random.seed(x)提供之前的值,其中x可以是任何数字或字符串等。

因此,random.random()实际上不是完美随机数,它可以通过random.seed(x)来预测。

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

因此,生成随机数实际上不是随机的,因为它是通过算法运行的。算法总是基于相同的输入给出相同的输出。这意味着,它取决于种子的价值。因此,为了使它更随机,时间被自动分配给seed()

在生成一组随机数之前设置seed(x),并使用相同的种子来生成同一组随机数。在重现问题的情况下很有用。

>>> 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.seed(a, version)在python中用于初始化伪随机数发生器. c。

PRNG是一种生成近似于随机数性质的数列的算法。这些随机数可以使用种子值重新生成。因此,如果您提供种子值,PRNG将使用种子从任意的起始状态开始。

参数a是种子值。如果a值为None,则默认使用当前系统时间。

version是一个整数,指定如何将参数a转换为整数。缺省值为2。

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

如果你想要复制相同的随机数,那么再次提供同样的种子

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

如果你不提供种子,那么它会生成不同的数字,而不是之前的1

random.randint(1, 10) # this gives 7 without providing seed
# 7

如果你提供不同的种子,那么它会给你一个不同的随机数

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

因此,总的来说,如果您希望复制相同的随机数,请提供种子。确切地说,是同一颗种子