【问题标题】:Difference between Numpy Randn and RandomStateNumpy Randn 和 RandomState 之间的区别
【发布时间】:2022-01-04 23:20:29
【问题描述】:

如果第二次执行,我对np.random.randn(n) 的印象会产生不同的样本。 如果第二次执行,np.random.RandomState(n_clusters).randn(n) 会产生相同的样本。它是否正确?另外,np.random.seed() 是做什么的?

我的代码:

np.random.RandomState(2).randn(2)
Out[6]: array([-0.41675785, -0.05626683])

np.random.RandomState(4).randn(2)
Out[7]: array([0.05056171, 0.49995133])

np.random.RandomState(42).randn(2)
Out[8]: array([ 0.49671415, -0.1382643 ])

np.random.RandomState(42).randn(2)
Out[9]: array([ 0.49671415, -0.1382643 ])

np.random.RandomState(4).randn(2)
Out[10]: array([0.05056171, 0.49995133])

np.random.RandomState(2).randn(2)
Out[11]: array([-0.41675785, -0.05626683])

np.random.randn(2)
Out[12]: array([ 0.47143516, -1.19097569])

np.random.randn(2)
Out[13]: array([ 1.43270697, -0.3126519 ])

【问题讨论】:

    标签: python arrays numpy random random-seed


    【解决方案1】:
    • randn 使用随机数生成器从标准正态分布返回值。它使用特定于您调用此函数的对象的数学算法,其值取决于引擎的最后状态。
    • RandomState 使用Mersenne Twister 算法返回一个伪随机数生成引擎,initializing its state 基于您传递的整数。

    你是对的,np.random.RandomState(n_clusters).randn(n) 中的np.random.RandomState(n_clusters) 部分首先创建了一个带有种子n_clusters 的prng 引擎。初始状态仅取决于种子,因此如果您稍后创建具有相同种子的引擎,它将处于相同的初始状态,生成相同的随机数。然后randn(n)方法使用底层Mersenne Twister算法从正态分布中生成2个随机数(内部是32位整数,一共生成4个,转化为值)。

    prng 引擎的初始状态必须在开始时定义。您可以定义种子,或者如果您省略它,就像在np.random.seed() 中一样,numpy 会根据时间或通过读取磁盘的某些部分来为您定义它以生成随机性的初始源。函数np.random.seed 定义了全局prng 引擎的种子,而np.random.RandomState 则可以保存返回值并在以后再次使用该引擎,

    myprng = numpy.random.RandomState(2)
    myprng.randn(10)
    

    【讨论】:

      【解决方案2】:

      np.random 使用Pseudorandom number generator(也称为 PRNG)生成看起来随机的数字序列。基本上它有一个内部“种子”编号,它应用一些函数来生成序列中的下一个数字。然后,此函数会更新内部种子,因此序列中的下一个数字可能会有所不同。

      np.random.RandomState(2) 创建一个新的 PRNG,其内部种子设置为 2。这个生成器会从一个固定的序列中产生数字,这就是为什么每次你调用np.random.RandomState(2).randn(2),你都会得到相同的2个数字。如果您改为保存RandomState 对象并在其上不断调用randn(2),您将获得与另一个RandomState(2) 相同的数字序列。

      >>> rs1 = np.random.RandomState(2)
      >>> rs2 = np.random.RandomState(2)
      >>> rs1.randn(2), rs2.randn(2)
      (array([-0.41675785, -0.05626683]), array([-0.41675785, -0.05626683]))
      >>> rs1.randn(2), rs2.randn(2)
      (array([-2.1361961 ,  1.64027081]), array([-2.1361961 ,  1.64027081]))
      

      np.random.seed(2) 会将种子设置为此 PRNG 的 global 实例为2。通常它会从进程开始时的时间戳开始播种,因此每次运行程序时都会获得新的随机数。设置此种子将使您在调用诸如使用全局 PRNG 的 np.random.randn(2) 之类的东西时获得确定性的随机数序列。

      >>> np.random.seed(2)
      >>> np.random.randn(2)
      array([-0.41675785, -0.05626683])
      >>> np.random.randn(2)
      array([-2.1361961 ,  1.64027081])
      

      【讨论】:

        猜你喜欢
        • 2016-09-10
        • 2013-07-04
        • 2012-06-17
        • 2016-11-16
        • 2018-05-01
        • 2021-09-06
        • 2015-08-05
        • 2016-11-11
        • 2019-01-18
        相关资源
        最近更新 更多