考虑这样的代码(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与一个调用有很大不同。我是否需要确保种子数量在后续调用之间存在显着差异,或者种子是否足够(无论如何)?
对于学生:请认识到上面的代码是超简化的
答案 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的应用程序。如果你正在使用需要加密声音的东西,那么种子通常需要根据输出非常难以推断,每次应用程序运行时都不同,难以简单猜测,并且无法通过逆向工程确定应用程序(即它们不能被硬编码)。
如果您的目标是游戏,那么您的要求可能会有所不同。例如,如果您正在控制计算机策略,但计算机的策略在游戏的所有运行中保持不变,那么您可能拥有一款易于击败的游戏。然后,您可能想要“简单”模式。