随机数生成器取决于好的种子以便提供真实的随机数。在良好种子的来源是接受用户的输入,因为人类行为不是确定性的。用户输入以创建用于随机数生成的种子
一种方法是让用户输入一些字符并测量击键之间的时间。这里一些代码来说明这一点:
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);
}
我感兴趣的是你的意见,你的想法左右我的方法。有趣的是,我从来没有在互联网上看到这样的解决方案。
_“众所周知,随机数发生器依赖于良好的种子,以提供真正的随机数”。你从哪里得到这个想法?一个好的PRNG将为_any_种子产生“真正的”随机数(即在分配正确的情况下“真实”)...获得**真正的随机数的唯一方法是使用实际的随机过程来产生它们,而不是伪随机数生成器,就像Random类一样,比如编程框架中的那些)。 –
至于你上面的代码,使用人类输入时间是产生随机数的常用方法,而不是种子。例如,电子游戏机(例如老虎机,扑克游戏等)通常具有连续运行的PRNG,其中用户输入基于该连续运行的PRNG的当前状态来选择随机数。你的想法并不新鲜,Stack Overflow不适合在任何情况下对其进行一般性讨论。 –