【问题标题】:Why `seed()` method isn't part of `randint()` function?为什么`seed()`方法不是`randint()`函数的一部分?
【发布时间】:2022-01-05 23:44:47
【问题描述】:

看来我对Numpy随机方法和函数的了解还不够。从未见过像这个简单示例中那样链接到函数的方法:

seed(4)

randint(0,10,10)

...seed()randint() 调用的地方

我想知道:

  1. 为什么种子不是 randint 函数的一部分作为关键字参数?
  2. 这种创建Nupy 函数的方式背后的想法是什么?

【问题讨论】:

  • 随机数生成器通过播种一次然后生成随机数流来工作。将种子作为 randint 的参数是没有意义的。
  • 这是为了向后兼容而保留随机的旧方法。有一种新方法可以构建一个 randomgenerator 对象并调用它的函数,这与您似乎喜欢的相似:numpy.org/doc/stable/reference/random/generator.html
  • 有时我们想重复一个“随机”测试用例,并在脚本开头使用seed。否则别管它。常规随机数使用不需要它。
  • 在某些情况下我们可能需要两个不同值的seed()?
  • 大约两个seed()s:我的意思是当我们生成两组随机数时,每个函数的seed() 值不同?

标签: python numpy random-seed


【解决方案1】:

种子用于确定 RNG 结果的序列。像这样:

In [1]: import numpy

In [2]: numpy.random.seed(4)

In [3]: numpy.random.randint(0, 10, 10)
Out[3]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

In [4]: numpy.random.randint(0, 10, 10)
Out[4]: array([7, 9, 8, 4, 2, 6, 4, 3, 0, 7])

In [5]: numpy.random.randint(0, 10, 10)
Out[5]: array([5, 5, 9, 6, 6, 8, 2, 5, 8, 1])

In [6]: numpy.random.randint(0, 10, 10)
Out[6]: array([2, 7, 0, 8, 3, 1, 0, 3, 2, 3])

In [7]: numpy.random.seed(4)

In [8]: numpy.random.randint(0, 10, 10)
Out[8]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

In [9]: numpy.random.randint(0, 10, 10)
Out[9]: array([7, 9, 8, 4, 2, 6, 4, 3, 0, 7])

In [10]: numpy.random.randint(0, 10, 10)
Out[10]: array([5, 5, 9, 6, 6, 8, 2, 5, 8, 1])

In [11]: numpy.random.randint(0, 10, 10)
Out[11]: array([2, 7, 0, 8, 3, 1, 0, 3, 2, 3])

看看在第二次seed 调用(在线In [7])之后,序列如何重置?

设置种子后,RNG 输出仍然具有相同的统计属性,但您可以使用相同的种子再次运行程序并获得相同的结果。这对于调试或可重现的模拟等事情很有用。


如果seedrandint 的一部分,则每次都会重置序列。它看起来像这样:

In [12]: numpy.random.seed(4)

In [13]: numpy.random.randint(0, 10, 10)
Out[13]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

In [14]: numpy.random.seed(4)

In [15]: numpy.random.randint(0, 10, 10)
Out[15]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

In [16]: numpy.random.seed(4)

In [17]: numpy.random.randint(0, 10, 10)
Out[17]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

In [18]: numpy.random.seed(4)

In [19]: numpy.random.randint(0, 10, 10)
Out[19]: array([7, 5, 1, 8, 7, 8, 2, 9, 7, 7])

每次调用的结果都相同。在每次调用时产生相同的结果不是我们希望 RNG 输出的行为方式。

【讨论】:

    【解决方案2】:

    randint 不是 numpy 中唯一的随机数/序列生成器,还有其他过多的随机函数,并且每次将种子传递给程序中的不同函数没有多大意义,相反,您初始化种子状态一次,然后用于所有随机函数。

    【讨论】:

    • 我不能说有没有这样的情况,但到目前为止我还没有看到。一般来说,一个程序只有一个种子,种子的目的基本上是让生成器的输出可预测,这意味着随机生成器总是为给定的种子生成相同的值。
    • 对不起,我在这里删除了这个问题——因为我把它贴在上面了。问题是:是否存在我们可能需要两个具有不同值的种子()的情况? @ThePyGuy 我已经检查过,当我们在第一个和第一个 randint 下方创建 seed 的新实例时,我们能够生成不同的随机数集。
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2013-09-26
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多