2017-06-10 34 views
-4

随机数生成器取决于好的种子以便提供真实的随机数。在良好种子的来源是接受用户的输入,因为人类行为不是确定性的。用户输入以创建用于随机数生成的种子

一种方法是让用户输入一些字符并测量击键之间的时间。这里一些代码来说明这一点:

 Console.WriteLine("please enter some text (at least 10 characters)"); 
     DateTime startDateTime = DateTime.Now; 
     List<double> timeStamps = new List<double>(); 
     ConsoleKeyInfo cki; 
     int cnt = 0; 
     do 
     { 
      cki = Console.ReadKey(); 
      double timeStamp = DateTime.Now.Subtract(startDateTime).TotalMilliseconds; 
      timeStamps.Add(timeStamp); 
      cnt++; 
     } 
     while ((cki.Key != ConsoleKey.Enter) || (cnt<3)); 
     Console.WriteLine(); 

上面的代码测量bertween密钥库,其被保存在阵列时间戳的时间。

利用这个人的数据,这些数据计算种子是这样的:

 double sum = timeStamps.Sum(v => v * 20); 
     int seed = Convert.ToInt32(sum); 
     Console.WriteLine($"seed: {seed}"); 

然后,我们可以计算出真正的随机数:

 Console.WriteLine("5 random values:"); 
     Random rnd = new Random(seed); 
     for(int i=0;i<5;i++) 
     { 
      int n = rnd.Next(100, 200); 
      Console.WriteLine(n); 
     } 

我感兴趣的是你的意见,你的想法左右我的方法。有趣的是,我从来没有在互联网上看到这样的解决方案。

+1

_“众所周知,随机数发生器依赖于良好的种子,以提供真正的随机数”。你从哪里得到这个想法?一个好的PRNG将为_any_种子产生“真正的”随机数(即在分配正确的情况下“真实”)...获得**真正的随机数的唯一方法是使用实​​际的随机过程来产生它们,而不是伪随机数生成器,就像Random类一样,比如编程框架中的那些)。 –

+0

至于你上面的代码,使用人类输入时间是产生随机数的常用方法,而不是种子。例如,电子游戏机(例如老虎机,扑克游戏等)通常具有连续运行的PRNG,其中用户输入基于该连续运行的PRNG的当前状态来选择随机数。你的想法并不新鲜,Stack Overflow不适合在任何情况下对其进行一般性讨论。 –

回答

-1

Actualle我认为你误解了一些概念。

您正在篡改伪随机数发生器。这些建立在产生随机数的函数上,每个返回的数字都是从前一个返回的数中计算出来的。知道第一个数字,你每次都得到相同的序列确切的。输出看起来是随机的,对于鬃毛目的而言是足够随机的。作为一个已知的序列还可以为特定行为编写测试,因为您可以为每次测试重现随机数字。它基本上是一个已知的模式或数字序列。

但假设输出是密码安全的,随机性并不安全。不要使用伪随机数生成秘密。不要使用伪随机数生成秘密。

大多数语言都有创建真随机数的模块。 (在.NET中它将是CryptoRandomProvider)。这些类使用真正的熵,如网络包的组合,鼠标和键盘上的输入,磁盘搜索以及不会创建真正的随机数字。在Linux上,您可以从/ dev/random读取包含真正随机字节的内容,但也可能会耗尽。