【发布时间】:2017-02-11 04:01:22
【问题描述】:
我正在使用irand=randrange(0,10) 在程序中生成随机数。这个随机数生成器在代码中被多次使用。在代码的开头,我使用random.seed(1234) 启动种子。这是正确的做法吗?
【问题讨论】:
-
“这是正确的做法吗?”为了什么?可重复性?播种 RNG 是为了获得可重复的结果。
我正在使用irand=randrange(0,10) 在程序中生成随机数。这个随机数生成器在代码中被多次使用。在代码的开头,我使用random.seed(1234) 启动种子。这是正确的做法吗?
【问题讨论】:
在开始时播种随机数生成器将确保每次运行代码时生成相同的随机数。这可能是也可能不是“正确的做法”,具体取决于您计划如何使用随机数。
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 将确保您每次运行代码时生成不同的随机数。
【讨论】:
正如文档所说,当您使用 random.seed 时,您有两个选择:
random.seed() - 来自当前时间或来自操作系统特定随机源(如果可用)的种子
random.seed(a) - hash(a) 被用作种子
如果您想在程序的两个实例之间使用不同的数字,则使用时间作为种子是更好的做法,但肯定更难调试。
使用硬编码数字作为种子让您的随机数更加可预测。
【讨论】: