【问题标题】:Seeding Python's random number generator播种 Python 的随机数生成器
【发布时间】:2017-02-11 04:01:22
【问题描述】:

我正在使用irand=randrange(0,10) 在程序中生成随机数。这个随机数生成器在代码中被多次使用。在代码的开头,我使用random.seed(1234) 启动种子。这是正确的做法吗?

【问题讨论】:

  • “这是正确的做法吗?”为了什么?可重复性?播种 RNG 是为了获得可重复的结果。

标签: python numpy scipy


【解决方案1】:

在开始时播种随机数生成器将确保每次运行代码时生成相同的随机数。这可能是也可能不是“正确的做法”,具体取决于您计划如何使用随机数。

import random

# Initial seeding
random.seed(1234)
[random.randrange(0, 10) for _ in range(10)]
# [7, 1, 0, 1, 9, 0, 1, 1, 5, 3]

# Re-seeding produces the same results
random.seed(1234)
[random.randrange(0, 10) for _ in range(10)]
# [7, 1, 0, 1, 9, 0, 1, 1, 5, 3]

# Continuing on the same seed produces new random numbers
[random.randrange(0, 10) for _ in range(10)]
# [0, 0, 0, 5, 9, 7, 9, 7, 2, 1]

如果您没有在代码开头设置随机数生成器,那么it is seeded with the current system time 将确保您每次运行代码时生成不同的随机数。

【讨论】:

  • 与接受的相比,这是更好的答案。
  • "这将确保每次运行代码时它都会产生不同的随机数。"除非你碰巧运行了几个进程,否则它可能会确保完全相反。
【解决方案2】:

正如文档所说,当您使用 random.seed 时,您有两个选择:

random.seed() - 来自当前时间或来自操作系统特定随机源(如果可用)的种子

random.seed(a) - hash(a) 被用作种子

如果您想在程序的两个实例之间使用不同的数字,则使用时间作为种子是更好的做法,但肯定更难调试。

使用硬编码数字作为种子让您的随机数更加可预测。

【讨论】:

  • “以时间为种子是更好的做法”,这是短视的。例如数值模拟绝对不是更好的和平。
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 2019-07-16
  • 2016-07-22
  • 2010-09-30
  • 2013-09-24
  • 2010-10-05
  • 2012-08-10
相关资源
最近更新 更多