2014-03-25 61 views
72

我在Python中做什么random.seed()有点困惑。例如,为什么下面的试验能够做到(一致)?random.seed():它做什么?

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

我在这找不到很好的文档。提前致谢!

+11

随机数字的生成不是真正的“随机”。它是确定性的,它产生的序列是由你传入“random.seed”的种子值决定的。通常你只需调用random.seed(),它使用当前时间作为种子值,这意味着每当你运行脚本时,你将得到不同的值序列。 –

+0

将相同的种子传递给随机,然后调用它会给你相同的一组数字。这是按预期工作的,如果你希望每次你启动一个应用程序时(例如从/ dev/random或time的输出),每次你必须使用不同的结果,结果会不同。 –

+0

种子是什么送到RNG产生第一个随机数。在那之后,他们RNG是自给自足的。由于这个原因,你并没有看到相同的答案。如果您再次运行此脚本,您将获得相同的“随机”数字序列。如果您想重现结果,设置种子会很有帮助,因为所有生成的“随机”数字总是相同的。 – Blink

回答

91

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

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

一般来说,你想给你的随机数发生器播种一些值,这会改变程序的每一次执行。例如,当前时间是一个常用的种子。这种情况不会自动发生的原因是,如果你愿意,你可以提供一个特定的种子来获得一个已知的数字序列。

+5

可能值得一提的是,有时我们想给种子,以便在程序的每次运行中生成相同的随机序列。有时,避免软件程序中的随机性,以保持程序行为的确定性和再现问题/错误的可能性。 – ViFI

4

在这种情况下,随机实际上是伪随机的。给定一个种子,它会产生一个平均分配的数字。但是使用相同的种子,每次都会产生相同的数字序列。如果你想改变它,你必须改变你的种子。很多人喜欢根据当前时间或某物产生种子。

45

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

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

[编辑] – MartinM

+0

@MartinM,当我在阅读“Learning Python,5th Edition强大的面向对象编程”时,我认为他们做了很好的解释。之后,我在google上进行了大量搜索,并尝试手动运行代码,最后通过观察输出结果让我了解代码的功能。希望这有助于帮助 –

+0

@RiteshKarwa,你的代码是从链接中获取的是Martin所说的。这是一个直接复制/粘贴。 –

0

这里是一个小的测试,证明了喂养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) 
+0

较短的平等检查:'len(set(l))<= 1' –

13
>>> 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之间的随机数。所以你可以假定一个数字为一个种子值。

2

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 
2
#Simple python programme to understand random.seed() importance 

import random 

random.seed(10) 

for i in range(5): 

     print(random.randint(1,100)) 

执行上述程序多次....

第一尝试:在打印1的范围5个的随机整数 - 100

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

第三尝试:同

.....于是就

说明:每一次我们正在运行我们设置种子10上面的程序,然后随机数发生器以此为参考variable.And然后通过做一些预定义的公式,它会生成一个随机数。

在未来执行因此结籽10再次将参考号码为10,再相同的行为开始....

只要我们重置种子值也给出了同样的植物。

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

相关问题