简单问题:
我正在使用python random模块生成随机整数。我想知道random.seed()函数使用的建议值是多少?目前我将此默认设置为当前时间,但这并不理想。看起来字符串文字常量(类似于密码)也不理想/强烈
建议?
谢谢, -AJ
更新:
我生成随机整数的原因是为了生成测试数据。这些数字不需要是可重复的。
答案 0 :(得分:13)
根据random.seed
的文档:
如果省略x或无,则使用当前系统时间;当前系统时间也用于在首次导入模块时初始化生成器。如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参阅
os.urandom()
函数)。
如果你没有将某些内容传递给种子,它将尝试使用操作系统提供的随机源而不是时间,这总是更好的选择。这可以为您节省一些工作,并且可以达到最佳效果。关于可用性,os.urandom
的文档告诉我们:
在类UNIX系统上,这将查询/ dev / urandom,在Windows上,它将使用CryptGenRandom。
跨平台随机种子是这里的重大胜利;您可以安全地省略种子并相信它几乎在您将使用Python的每个平台上随机。即使Python回归到时间,也可能只有一毫秒的窗口(或更少)来猜测种子。我不认为你会使用当前时间遇到任何麻烦 - 即便如此,它只是一个后备。
答案 1 :(得分:5)
对于大多数使用当前时间的情况已经足够了。有时,为了进行比较,您需要使用固定数字生成伪随机数。
答案 2 :(得分:3)
设置种子是为了重复性,而不是安全性。如果有的话,通过使用固定种子而不是不断变化的种子,使系统 less 安全。
答案 3 :(得分:1)
也许这不是你的问题,但是使用系统时间作为种子的问题是那些大致知道你的系统何时启动的人可能会在看到你的种子后猜测你的种子(通过试验)序列中的数字 例如,不要将系统时间用作在线扑克游戏的种子
答案 4 :(得分:0)
如果您使用随机生成测试数据,我想建议重现性非常重要。
想一个用例:对于数据集X,你会得到一些奇怪的行为(例如崩溃)。事实证明,数据集X显示了一些在其他数据集Y和Z中不那么明显的功能,并揭示了一个已经逃脱测试套件的错误。现在知道种子是有用的,这样你就可以精确地重现bug,你可以修复它。