【问题标题】:Why different random numbers are generated even after specifying seed value? [duplicate]为什么即使在指定种子值之后也会生成不同的随机数? [复制]
【发布时间】:2019-02-14 10:58:06
【问题描述】:

我读到如果您指定种子值,它会生成相同的随机数。在下面的代码中,虽然我已经指定了种子值,但在 for 循环中,rf 正在生成不同的随机值。但是,如果我省略 for 循环并运行此代码两次,则 rf 会生成相同的随机值。有人可以解释一下为什么会这样吗?

SEED= 1234567
s=np.random.seed(SEED)
print(s)
for i in range(3):
   rf=np.random.uniform(-1.0,1.0,(3,4))
   print(rf)

【问题讨论】:

  • 每次生成随机数时都需要定义种子。通过将种子定义为相同的数字,生成的随机数变得相同。
  • 所以在上面的代码中,我将种子值固定为 1234567,我希望循环运行 3 次时 rf 应该相同
  • 尝试将np.random.seed(SEED) 移动到循环的顶部
  • 如果我在循环内移动 np.random.seed(SEED) 它会生成相同的数字 3 次。 .为什么在循环外指定它一次不会显示相同的行为

标签: python numpy


【解决方案1】:

是的。当您调用random.seed() 时,它会设置随机种子。您从该点向前生成的数字序列将始终相同。

问题是,您只设置了一次种子,然后您调用了三次np.random.uniform()。这意味着您将从random.seed() 获得接下来的三个数字。当然它们是不同的——你没有在两者之间重置种子。但是每次运行程序,你都会得到相同的三个数字序列,因为你在生成它们之前将种子设置为相同的东西。

设置种子只会影响下一个要生成的随机数,因为伪随机数生成(np.random 使用)的工作原理:它使用种子确定性地生成新的随机数,然后使用 生成的数字为下一个数字设置新的种子。它实际上归结为得到一个 非常长 的随机数序列,这些随机数最终会自我重复。当您设置种子时,您将跳转到该序列中的指定点——不过,您并没有将代码保留在那里。

【讨论】:

  • 不错的答案。 OP 可以通过在循环内调用seed 来获得所需的结果。
  • 你的意思是“每次你运行程序。你会得到相同的三个数字序列”?
  • 假设您运行程序一次,它会打印出“0.77, -0.36, 0.52”。然后,您再次运行该程序,它会打印出相同的三个数字。然后你第三次运行它,它会打印出相同的三个数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2013-02-01
  • 2011-05-06
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多