考虑这样的(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从一个调用到另一个显著不同。 我需要确保种子数量的后续调用之间显著不同,或者是它足够的种子是不同的(无论怎样)?
要学究:请意识到上面的代码是超级过于简单化
答案很简单:避免重新播种,因为它不会在这里买任何东西。 下面长的答案。
这一切都取决于正是你需要的。 在在伪随机数发生器的初始化常见缺陷是概述了线性依赖种子(其中1个,2个,3个,4绝对是)是用于初始化多个的PRNG,用于模拟至少当希望和不相关的结果不好的选择。
如果你做的是滚动几个骰子,或产生的东西不加批判的一些伪随机输入,那么它很可能并不重要。
还请注意,使用PRNG本身的一些类用于产生种子具有在产生线性依赖数字(的LCG弹簧记)同样的问题。
如果你的随机数生成器是高品质的,它不应该不管你如何种子吧。 其实,最好的做法是种子它只有一次。 随机数生成器被设计成具有一定的统计行为, 一旦他们开始 。 经常补种有效地创建一个不同的随机数生成器,一个可能不那么好。
随机选择种子听起来是个好主意,但事实并非如此。 事实上,由于的“生日悖论”,有一个令人惊讶的高概率,你会选择相同的种子两次。
一般来说,你只有当你需要以相同的方式,每次通过生成随机数种子的随机数发生器。 当你有一个随机的组件添加到您的处理,但需要对其进行测试,因此希望它是测试之间是一致的,这非常有用。 否则,你让系统种子生成器本身。
。换句话说,通过播种与特定的预定义的种子随机数生成器,你实际上是降低了整个系统的随机性。 使用1:1的种子时产生的随机数确实伪随机不同于为2的种子,但硬编码的种子将导致在该程序的每次运行重复随机序列。
你似乎想伪随机数是不是伪随机的,与连续数比伪随机性,需要'显著的不同的概率较高。 我怀疑任何共同的PRNG将做到这一点,无论你的播种策略。
种子,让输出是不可预知的本身应该是随机的。 有可能出现问题,如果种子不同之处仅在一个或两个比特(作为这个问题演示)。
这取决于你所使用的PRNG用于该应用程序。 如果你正在使用的东西需要被加密的声音,然后将种子一般需要是非常困难的基础上,输出,不同的每一次应用程序运行时推断,很难简单地猜了,不可能通过逆向工程中的应用,以确定(即它们不能被硬编码)。
如果你的目标是一个游戏,你的要求可能会有所不同。 例如,如果你控制电脑的策略,但计算机的策略仍然是游戏中的所有运行相同的,你可能有一个容易不堪一击游戏。 话又说回来,你可能想,对于“简单”模式。