![计算机如何生成随机数](https://linux22.com/image/1444445/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90%E9%9A%8F%E6%9C%BA%E6%95%B0.png)
这很可能是我在这个 stackexchange 网站上问过的唯一问题。在编程中,根据不同的语言,有很多不同的方法来生成随机数。然而,困扰我一段时间的是,计算机生成的任何东西怎么可能是随机的?我发现这 这篇文章并没有得到很好的反响,而且它说的太宽泛了,或者说答案太多了。然而在我看来,答案只有一个,那就是它是如何工作的!我的意思是说,有计算机背景的人应该能够回答这个问题,所以我并不是在征求你的意见。最后要说的是,如果我在错误的论坛上,我想道歉。
答案1
它们能不能实现取决于计算机。通常,这是一种伪随机算法。最早的算法之一基本上只是对一个称为种子的数字执行一系列基本算术(乘、除、加、减、取模),然后取中间的数字,或类似的东西。这些数字看起来是随机的,但经过一定次数的试验后,相同的循环就会重复。
这意味着他们不能使用 PRNG 来加密您的密码。PRNG 通常使用系统时间作为种子,因此如果攻击者知道您的密码加密的大致时间(帐户创建时间、密码更改时间),他们只需使用该时间范围生成一小段密码,然后尝试所有生成的密码,而不必生成所有可能的组合。
如果你曾经访问过 www.random.org,你可能会发现他们生成的是真正的随机数。这是因为他们使用设备收集大气噪声或某种噪声大气数据,然后使用这些数据。
我不是这方面的专家,但我认为一些操作系统可能还会收集用户鼠标移动和键盘按下的数据,以及 PRNG 来生成足够安全的数字来加密密码
答案2
他们没有
他们使用被称为伪随机数生成器(PRNG)。除非您提供一个唯一的“种子”数字作为启动序列,否则它们总是会产生相同的数字序列。
种子数可以通过相对随机的来源组合来创建 - 例如当前时间的毫秒的最后几位数字、鼠标指针的最后几次动作。
结果是一系列数字,从许多方面来说,它们足够像随机序列而不可预测。
答案3
这是我的一个作业中的一段代码。它生成随机数,然后检查该随机数是否已放入数组中,如果尚未放入,则允许放入,否则不使用它。
public static int[] RandomArray(int RandArrayNValue)
{
int[] array = new int[RandArrayNValue];
Random rand = new Random();
for (int i = 0; i < RandArrayNValue; i++)
{
array[i] = i + 1;
}
Console.WriteLine();
for (int i = array.Length - 1; i >= 0; i--)
{
int Store = rand.Next(i);
int TempStore = array[Store];
array[Store] = array[i];
array[i] = TempStore;
Console.WriteLine(" " + array[i]);
}
return array;
}