[英]random.seed(): What does it do?
我对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
我找不到这方面的好文档。
伪随机数生成器通过对值执行一些操作来工作。 通常,此值是生成器生成的前一个数字。 但是,第一次使用生成器时,没有以前的值。
为伪随机数生成器做种子会为其提供第一个“前一个”值。 每个种子值将对应于给定随机数生成器的一系列生成值。 也就是说,如果您提供相同的种子两次,您将获得两次相同的数字序列。
通常,您希望为随机数生成器设置一些值,该值会改变程序的每次执行。 例如,当前时间是一个经常使用的种子。 这不会自动发生的原因是,如果您愿意,您可以提供特定的种子来获得已知的数字序列。
所有其他答案似乎都没有解释 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
>>> 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 之间的随机数。 所以你假设一个种子值有一组数字。
随机数是通过对先前值的某种操作生成的。
如果没有以前的值,则当前时间将自动作为以前的值。 我们可以使用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() 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])
>>>
# 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 个随机数。
第三次尝试:相同
.....很快
解释:每次我们运行上面的程序时,我们都将种子设置为 10,然后随机生成器将其作为参考变量。 然后通过执行一些预定义的公式,它会生成一个随机数。
因此,在下一次执行中将种子设置为 10 再次将参考编号设置为 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
在生成一组随机数之前设置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.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(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
因此,总而言之,如果您希望复制相同的随机数,请提供种子。 具体来说,相同的种子。
这是一个小测试,它演示了使用相同的参数提供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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.