random.seed():它是做什么的?


181

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

我找不到关于此的好的文档。


33
随机数生成并不是真正的“随机”。它是确定性的,它生成的序列由您传递到的种子值决定random.seed。通常,您只需调用random.seed(),它将当前时间用作种子值,这意味着每当您运行脚本时,您都会获得不同的值序列。
Asad Saeeduddin 2014年

3
将相同的种子传递给随机对象,然后调用它将给您相同的一组数字。这可以按预期工作,并且如果您希望每次结果都不同,则每次启动应用程序时都必须使用不同的内容作为种子(例如/ dev / random或time的输出)
Tymoteusz Paul

6
种子被馈送到RNG以生成第一个随机数。之后,他们的RNG是自给的。因此,您不会始终看到相同的答案。如果再次运行此脚本,则将获得相同的“随机”数字序列。如果您想重现结果,则设置种子是有帮助的,因为生成的所有“随机”数字将始终相同。
2014年

值得一提的是:本文中显示的顺序在Python 2中。Python3提供了不同的顺序。
ggorlen

1
@Blink对“随机数”的使用具有误导性。RNG的内部状态为自给。从此内部状态中,可得出randint(1,10)和其他调用的输出。如果RNG是从randint(1,10)的输出中获取的,则该序列将折叠至最多10个序列中的1个,并且该序列将在最多10个数字之后重复。
约阿希姆·瓦格纳

Answers:


219

伪随机数生成器通过对值执行某些操作来工作。通常,此值是生成器生成的先前编号。但是,第一次使用生成器时,没有先前的值。

播种伪随机数生成器会为其赋予第一个“上一个”值。每个种子值将对应于给定随机数生成器的一系列生成值。也就是说,如果两次提供相同的种子,则两次获得相同的数字序列。

通常,您希望为随机数生成器添加一些值,这些值将更改程序的每次执行。例如,当前时间是一个经常使用的种子。之所以不会自动发生,是因为您可以根据需要提供特定的种子来获得已知的数字序列。


42
也许值得一提的是,有时我们希望提供种子,以便在程序的每次运行中都生成相同的随机序列。有时,应避免软件程序的随机性,以保持程序行为的确定性和重现问题/错误的可能性。
ViFI

1
按照@ViFI所说,保持程序行为的确定性(使用固定的种子或固定的种子序列)还可以使您更好地评估对程序的某些更改是否有益。
shaneb '18

您介意解释一些现实生活中的情况吗?我无法理解相同的用例。我们是否在其他编程语言中也有与此类似的东西?
Shashank Vivek '18

1
这是一个现实生活场景:stackoverflow.com/questions/5836335/…。随机种子也很常见,可以产生可重复的研究结果。例如,如果您是一名数据科学家,并且想要使用某种使用随机性的模型(例如随机森林)来发布结果,则需要在已发布的代码中包含一个种子,以便人们可以确保您的计算是可重复的。
加伦·朗

因此,seed实际上可以以我们想要的方式去随机化随机函数。
吉丁

90

所有其他答案似乎都无法解释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

34
>>> 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之间的随机数。因此,您为一个种子值假设一组数字。


16

通过对先前值进行某些运算会生成一个随机数

如果没有先前的值,那么当前时间将自动作为先前的值。我们可以使用random.seed(x)where自己提供此先前的值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()


13
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])
>>>

12
# 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,并且相同的行为再次开始...

一旦我们重置种子值,它就会得到相同的植物。

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


7

在这种情况下,随机实际上是伪随机。给定种子,它将生成具有相等分布的数字。但是使用相同的种子,它将每次生成相同的数字序列。如果要更改它,则必须更改种子。许多人喜欢基于当前时间或某种东西来生成种子。


6

恕我直言,当您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

4

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

3

这是我的理解。每次我们设置种子值时,都会生成一个“标签”或“参考”。下一个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

1

这是一个小测试,演示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)

4
较短的平等检查:len(set(l))<=1
奥利弗·倪

1

random.seed(a, version)在python中用于初始化伪随机数生成器(PRNG)

PRNG是一种生成近似随机数属性的数字序列的算法。可以使用种子值复制这些随机数。因此,如果提供种子值,则PRNG使用种子从任意的起始状态开始。

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

并且version是一个整数,指定了如何将一个参数转换为整数。预设值为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

因此,总而言之,如果要复制相同的随机数,请提供种子。具体来说,是相同的种子

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.