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

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


当前回答

下面是一个小测试,演示了给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)

其他回答

下面是一个小测试,演示了给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()的使用。 下面是一个简单的例子(来源):

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

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

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

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

在生成一组随机数之前设置种子(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(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()。