Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random &引用;“重置”;伪随机数生成器多次种子?_Random - Fatal编程技术网

Random &引用;“重置”;伪随机数生成器多次种子?

Random &引用;“重置”;伪随机数生成器多次种子?,random,Random,今天,我的朋友有一个想法,使用生成的伪随机数多次设置伪随机数生成器的种子,以“使事情更加随机” C#中的一个例子: //使用基于时间的种子启动一个 Random rand=新随机数(自unix_epoch()以来的毫秒数); //然后循环一个\u次数\u次。。。 for(int i=0;i

今天,我的朋友有一个想法,使用生成的伪随机数多次设置伪随机数生成器的种子,以“使事情更加随机”

C#中的一个例子:

//使用基于时间的种子启动一个
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

    具有此最终种子的随机对象与任何其他随机对象一样。创建伪随机数需要花费更多的时间。

    伪随机数有三个基本的使用级别。每一级包含其下一级

  • 没有特定相关性保证的意外数字。此级别的生成器通常具有一些隐藏的相关性,这些相关性可能对您很重要,也可能不重要
  • 已知不相关的统计独立数。数值模拟通常需要这些参数
  • 无法猜出的加密安全数字。当安全性出现问题时,这些都是必需的
  • 这些都是确定性的。随机数生成器是一种具有某种内部状态的算法。一旦应用该算法,就会产生一个新的内部状态和一个输出编号。播种发电机意味着设置内部状态;种子接口并不总是允许设置所有可能的内部状态。作为一个很好的经验法则,始终假定默认的library 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),所以不要为了安全目的依赖于这种形式的种子设定。

    你的例子不会增加随机性,因为没有增加随机性。它只是从程序的执行时间派生出来的

    计算机不使用基于当前时间的数据,而是维持一个熵池,并用统计上随机(或至少不可用)的数据来建立它。例如,网络数据包、按键或硬盘读取时间之间的定时延迟

    如果你想要好的随机数,你应该利用熵池。这些被称为


    在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