随机种子需要有多么不同?

时间:2009-10-12 14:39:53

标签: random

考虑这样的代码(Python):

import random

for i in [1, 2, 3, 4]:
    random.seed(i)
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers
    doStuff(randNumbers)

我想确保randNumbers与一个调用有很大不同。我是否需要确保种子数量在后续调用之间存在显着差异,或者种子是否足够(无论如何)?

对于学生:请认识到上面的代码是超简化的

6 个答案:

答案 0 :(得分:9)

简短回答:避免再播种,因为它不会在这里给你买任何东西。下面的答案很长。


这一切都取决于你究竟需要什么。在Common defects in initialization of pseudorandom number generators中,概述了线性相关种子(肯定是1,2,3,4)对于初始化多个PRNG是一个不好的选择,至少在用于模拟和期望不相关的结果时是这样。

如果您所做的只是滚动几个骰子,或者为一些不加批判的事物生成一些伪随机输入,那么它很可能无关紧要。

另请注意,使用PRNG本身的某些类来生成种子在生成线性相关数时会产生同样的问题(想到LCG)。

答案 1 :(得分:4)

如果您的随机数发生器质量很高,那么接种它的方式并不重要。事实上,最好的做法是只播种一次。随机数生成器设计为一旦启动就具有某些统计行为。经常重播会有效地创建一个不同的随机数生成器,可能不会那么好。

随机选择种子听起来是个好主意,但事实并非如此。事实上,由于“生日悖论”,你两次选择同一种子的概率极高。

答案 2 :(得分:2)

一般来说,当您需要每次都以相同的方式生成随机数时,您只会为随机数生成器播种。当您有一个随机组件进行处理时,这很有用,但需要测试它,因此希望它在测试之间保持一致。否则,让系统为发生器本身播种。

换句话说,通过使用特定的预定义种子为随机数生成器播种,实际上减少了整个系统的随机性。使用种子1时生成的随机数确实与种子为2的伪随机数不同,但硬编码种子将在程序的每次运行中产生重复的随机序列。

答案 3 :(得分:1)

您似乎希望伪随机数不是伪随机数,连续数字与伪随机性要求“显着”不同的概率更高。无论你的播种策略如何,我都怀疑任何普通的行为都会这样做。

答案 4 :(得分:0)

种子本身应该是随机的,因此输出是不可预测的。如果种子只有一位或两位不同(如this question所示),则可能会出现问题。

答案 5 :(得分:0)

这取决于您使用PRNG的应用程序。如果你正在使用需要加密声音的东西,那么种子通常需要根据输出非常难以推断,每次应用程序运行时都不同,难以简单猜测,并且无法通过逆向工程确定应用程序(即它们不能被硬编码)。

如果您的目标是游戏,那么您的要求可能会有所不同。例如,如果您正在控制计算机策略,但计算机的策略在游戏的所有运行中保持不变,那么您可能拥有一款易于击败的游戏。然后,您可能想要“简单”模式。