Python random.seed():它做什么?
我对Python random.seed():它做什么?,python,random,random-seed,Python,Random,Random Seed,我对random.seed()在Python中的作用有点困惑。例如,为什么下面的试验会(一致地)这样做 我找不到这方面的好文档。在本例中,随机实际上是伪随机的。给定一个种子,它将生成分布相等的数。但使用相同的种子,它每次都会生成相同的数字序列。如果你想改变,你必须改变你的种子。许多人喜欢根据当前时间或其他信息生成种子。伪随机数生成器通过对值执行某些操作来工作。通常,该值是生成器生成的上一个数字。但是,第一次使用生成器时,没有以前的值 为伪随机数生成器设定种子将为其提供第一个“先前”值。每个种子值
random.seed()
在Python中的作用有点困惑。例如,为什么下面的试验会(一致地)这样做
我找不到这方面的好文档。在本例中,随机实际上是伪随机的。给定一个种子,它将生成分布相等的数。但使用相同的种子,它每次都会生成相同的数字序列。如果你想改变,你必须改变你的种子。许多人喜欢根据当前时间或其他信息生成种子。伪随机数生成器通过对值执行某些操作来工作。通常,该值是生成器生成的上一个数字。但是,第一次使用生成器时,没有以前的值 为伪随机数生成器设定种子将为其提供第一个“先前”值。每个种子值将对应于给定随机数生成器的生成值序列。也就是说,如果您两次提供相同的种子,您将两次获得相同的数字序列
通常,您希望在随机数生成器中添加一些值,这些值将更改程序的每次执行。例如,当前时间是一个常用的种子。这不会自动发生的原因是,如果需要,可以提供特定的种子以获得已知的数字序列。所有其他答案似乎都无法解释random.seed()的用法。 下面是一个简单的例子():
下面是一个小测试,它演示了使用相同的参数填充
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”给随机值生成器('random.randint()')一个值,该生成器基于此种子生成这些值。随机数的一个必须属性是它们应该是可复制的。当你播下同样的种子,你会得到同样的随机数模式。这样,您就可以从一开始就生成它们。你给一个不同的种子-它以不同的首字母开始(3以上)
给定一个种子,它将一个接一个地生成1到10之间的随机数。因此,假设一组数字代表一个种子值。Imho,再次使用
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
执行上述程序多次
第一次尝试:打印1-100范围内的5个随机整数
第二次尝试:打印上述执行中出现的5个相同的随机数
第三次尝试:相同
……等等
说明:每次运行上述程序时,我们都将seed设置为10,然后随机生成器将其作为参考变量。然后通过做一些预定义的公式,它生成一个随机数
因此,在下一次执行中将seed设置为10会再次将reference number设置为10,并再次启动相同的行为
一旦我们重新设定种子值,它就会给出相同的植物
注意:更改种子值并运行程序,您将看到与前一个不同的随机序列。以下是我的理解。
每次设置种子值时,都会生成一个“标签”或“引用”。下一个random.function调用附加到此“标签”上,因此下次调用相同的种子值和random.function时,它将给出相同的结果
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
一个随机数是通过对前一个值进行某些操作生成的 如果没有以前的值,则当前时间将自动作为以前的值。我们可以自己使用
random.seed(x)
提供这个先前的值,其中x
可以是任何数字或字符串等
因此,random.random()
实际上并不是完美的随机数,它可以通过random.seed(x)
进行预测
因此,生成一个随机数实际上并不是随机的,因为它是在算法上运行的。算法总是基于相同的输入给出相同的输出。这意味着,它取决于种子的价值。因此,为了使其更随机,时间会自动分配给种子()
在生成一组随机数之前设置种子(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
>>>
python中的seed(a,version)用于初始化伪随机数生成器(PRNG)
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
总之,如果希望复制相同的随机数,请提供种子。具体来说,相同的种子随机数生成并不是真正的“随机”。它是确定性的,它生成的序列由传递到
random.seed的种子值决定。通常,您只需调用random.seed()
,它使用当前时间作为种子值,这意味着无论何时运行脚本,您都将获得不同的值序列。将相同的种子传递给random,然后调用它将得到相同的数集。这是预期的工作,如果你想得到不同的结果
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
>>> 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
>>>
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
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