Random &引用;“重置”;伪随机数生成器多次种子?
今天,我的朋友有一个想法,使用生成的伪随机数多次设置伪随机数生成器的种子,以“使事情更加随机” C#中的一个例子:Random &引用;“重置”;伪随机数生成器多次种子?,random,Random,今天,我的朋友有一个想法,使用生成的伪随机数多次设置伪随机数生成器的种子,以“使事情更加随机” C#中的一个例子: //使用基于时间的种子启动一个 Random rand=新随机数(自unix_epoch()以来的毫秒数); //然后循环一个\u次数\u次。。。 for(int i=0;i
//使用基于时间的种子启动一个
Random rand=新随机数(自unix_epoch()以来的毫秒数);
//然后循环一个\u次数\u次。。。
for(int i=0;i
但我认为这可能会增加伪随机数生成器使用重复种子的机会
这个会吗
伪随机数生成器方面的专家能否给出一些详细的解释,以便我能说服我的朋友?我很高兴看到答案解释了一些伪随机数生成器算法的更多细节。这不会让事情变得更“随机” 我们的种子决定rand.next()给我们的随机但完全确定的数字序列 您的代码定义了从初始种子到某个最终种子的映射,而不是使事情变得更加随机,并且,给定相同的初始种子,您将始终以相同的最终种子结束 尝试使用此代码,您将了解我的意思(同时,):
int my_seed=100;//把我的种子换成你想要的
Random rand=新的Random(我的种子);
for(int i=0;i
具有此最终种子的随机对象与任何其他随机对象一样。创建伪随机数需要花费更多的时间。伪随机数有三个基本的使用级别。每一级包含其下一级
F
的迭代循环是一对整数n
和k
,其中F^(n)(k)=k
,其中指数是应用F
的次数。例如,F^(3)(x)=F(F(F(x))
。如果有一个很短的迭代周期,随机数将比其他情况下更频繁地重复。在给出的代码中,迭代函数是为生成器种子,然后获取第一个输出
要回答一个你没有问过的问题,但这与理解这一点有关,使用毫秒计数器播种会使你的生成器无法通过3级测试,即不可用性测试。这是因为可能的毫秒数在密码学上很小,这是一个已知需要进行穷举搜索的数字。在撰写本文时,2^50应被视为加密小。(对于任何一年的加密计算,请找一位著名专家。)现在一个世纪的毫秒数大约是2^(41.5),所以不要为了安全目的依赖于这种形式的种子设定。你的例子不会增加随机性,因为没有增加随机性。它只是从程序的执行时间派生出来的 计算机不使用基于当前时间的数据,而是维持一个熵池,并用统计上随机(或至少不可用)的数据来建立它。例如,网络数据包、按键或硬盘读取时间之间的定时延迟 如果你想要好的随机数,你应该利用熵池。这些被称为
在C#中,有关获取安全随机数的正确方法,请参见。。。您的最佳选择是(xkcd)掷骰子一次,并将其作为常量使用。不,只是开玩笑而已——计算机就是不能把随机数做得很好。每个非伪随机都使用外部(如物理测量)源进行初始化和随机性。。。所以,对于应用程序中的普通随机数,使用time.h(正如您已经做过的那样)这样的东西是不值得的。如果你真的需要随机数,考虑使用硬件。those@Najzero好吧,我只是想了解更多关于伪数发生器的知识,所以我不打算为此购买核衰变探测器。:)ffffshhh。。。再也没有承诺了,其他的都差不多了,但是使用当前时间怎么样(比如
毫秒\u自unix\u epoch()
)?是的,使用毫秒\u自
int my_seed = 100; // change my seed to whatever you want
Random rand = new Random(my_seed);
for (int i = 0; i < a_number_of_times; i++)
{
rand = new Random(rand.Next());
}
// does this print the same number every run if we don't change the starting seed?
Console.WriteLine(rand.Next()); // yes, it does