今天,我的朋友想到了使用生成的伪随机数多次设置伪随机数生成器的种子以"使事情更随机化".
C#中的一个例子:
// Initiate one with a time-based seed
Random rand = new Random(milliseconds_since_unix_epoch());
// Then loop for a_number_of_times...
for (int i = 0; i < a_number_of_times; i++)
{
// ... to initiate with the next random number generated
rand = new Random(rand.Next());
}
// So is `rand` now really random?
assert(rand.Next() is really_random);
Run Code Online (Sandbox Code Playgroud)
但我认为这可能会增加将重复种子用于伪随机数生成器的机会.
请问这个
伪随机数发生器的任何专家都能给出一些详细的解释,以便我可以说服我的朋友吗?我很乐意在一些伪随机数生成器算法中看到解释更详细的答案.
伪随机数有三种基本使用级别.每个级别都包含它下面的一个级别.
这些都是确定性的.随机数生成器是一种具有某种内部状态的算法.应用该算法一次产生新的内部状态和输出数.播种发电机意味着建立内部状态; 种子界面并不总是允许设置每个可能的内部状态.作为一个好的经验法则,总是假设默认库random()例程仅在最弱的级别1级运行.
要回答您的具体问题,问题(1)中的算法不能增加随机性,(2)可能会减少它.因此,随机性的期望严格低于在开始时播种一次.原因在于可能存在短迭代周期.为函数的迭代周期F
是一对整数n
和k
其中F^(n) (k) = k
,其中指数是的次数F
被应用.例如,F^(3) (x) = F(F(F(x)))
.如果有一个短的迭代周期,随机数将比其他情况更频繁地重复.在提供的代码中,迭代函数是为生成器播种,然后获取第一个输出.
要回答一个你不太想问的问题,但这与理解这个问题有关,用毫秒计数器进行播种会使你的发电机无法通过3级测试,无法测试.这是因为可能的毫秒数在加密方面很小,这是一个已知可以进行详尽搜索的数字.在撰写本文时,2 ^ 50应该被认为是加密小的.(对于在任何一年中加密大的数字,请找一位有信誉的专家.)现在一个世纪的毫秒数约为2 ^(41.5),因此出于安全考虑,不要依赖这种形式的播种.