【问题标题】:random.seed(): What does it do?random.seed():它有什么作用?
【发布时间】:2014-05-03 14:11:42
【问题描述】:

我对@9​​87654321@ 在 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 的种子值决定。通常您只需调用random.seed(),它使用当前时间作为种子值,这意味着无论何时运行脚本,您都会得到不同的值序列。
  • 将相同的种子传递给随机数,然后调用它会得到相同的一组数字。这是按预期工作的,如果您希望每次结果都不同,则每次启动应用程序时都必须使用不同的内容(例如 /dev/random 或 time 的输出)
  • 种子是提供给 RNG 以生成第一个随机数的。在那之后,他们的RNG是自给自足的。因此,您不会始终看到相同的答案。如果再次运行此脚本,您将获得相同的“随机”数字序列。如果您想重现结果,设置种子会很有帮助,因为生成的所有“随机”数字总是相同的。
  • 值得一提:这篇文章中显示的序列是在 Python 2 中。Python 3 给出了不同的序列。
  • @Blink 对“随机数”的使用具有误导性。 RNG 有一个自给自足的内部状态。从这个内部状态,导出 randint(1,10) 和其他调用的输出。如果 RNG 从 randint(1,10) 的输出中输入,则序列将折叠为最多 10 个序列中的 1 个,并且该序列将在最多 10 个数字后重复。

标签: python random random-seed


【解决方案1】:

一个随机数是通过对先前值的一些操作生成的。

如果没有以前的值,则当前时间自动作为以前的值。我们可以使用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()

【讨论】:

    【解决方案2】:
    >>> 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 之间的随机数。所以你假设一组数字对应一个种子值。

    【讨论】:

      【解决方案3】:

      random.seed(a, version)在python中用于初始化伪随机数生成器(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
      

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

      【讨论】:

        【解决方案4】:
        # Simple Python program to understand random.seed() importance
        
        import random
        
        random.seed(10)
        
        for i in range(5):    
            print(random.randint(1, 100))
        

        多次执行上述程序...

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

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

        第三次尝试:相同

        .....等等

        解释:每次运行上述程序时,我们将种子设置为 10,然后随机生成器将其作为参考变量。然后通过一些预定义的公式,生成一个随机数。

        因此在下一次执行中将种子设置为 10 再次将参考编号设置为 10 并再次开始相同的行为...

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:
            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])
            >>>
            

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                恕我直言,当您再次使用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
                

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    【解决方案10】:

                    这里有一个小测试,证明用相同的参数提供 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)
                    

                    【讨论】:

                    • 较短的相等性检查:len(set(l))<=1
                    【解决方案11】:

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

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

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

                    【讨论】:

                    • 可能值得一提的是,有时我们希望提供种子,以便在每次运行程序时生成相同的随机序列。有时,会避免软件程序中的随机性,以保持程序行为的确定性和重现问题/错误的可能性。
                    • 按照@ViFI 所说,保持程序行为确定性(使用固定种子或固定种子序列)还可以让您更好地评估对程序的某些更改是否有益。跨度>
                    • 你介意用一些现实生活场景来解释一下吗?我无法理解相同的用例。我们在其他编程语言中是否也有类似的东西?
                    • 这是一个真实的场景:stackoverflow.com/questions/5836335/…。随机种子也很常见,可以为研究创造可重复的结果。例如,如果您是一名数据科学家,并且您想使用某种使用随机性的模型(例如随机森林)发布您的结果,您需要在发布的代码中包含一个种子,以便人们可以确保您的计算是可重复的。
                    • 所以种子确实可以以我们想要的方式去随机化随机函数......?
                    【解决方案12】:

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

                    【讨论】:

                      猜你喜欢
                      • 2011-01-14
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-04-26
                      • 2016-04-29
                      • 2017-03-02
                      • 2012-10-04
                      • 1970-01-01
                      相关资源
                      最近更新 更多