许多好的答案,但让我补充一点,并强调一点,在确定性计算机中,没有什么是随机的。对于由伪RNG生成的数字和在为堆栈上的C / C ++局部变量保留的内存区域中发现的看似“随机”数字,都是如此。
但是...有一个关键的区别。
优质的伪随机数生成器生成的数字具有使其在统计上类似于真正的随机抽取的属性。例如,分布是均匀的。循环长度很长:在循环重复之前,您可以获得数百万个随机数。该序列不是自相关的:例如,如果您使用第2、3或27个数字,或者查看生成的数字中的特定数字,您将不会开始看到奇怪的模式。
相反,留在堆栈上的“随机”数字没有这些属性。它们的值及其明显的随机性完全取决于程序的构造方式,编译方式以及编译器对其进行优化的方式。举例来说,这是您作为独立程序的想法的变体:
#include <stdio.h>
notrandom()
{
int r, g, b;
printf("R=%d, G=%d, B=%d", r&255, g&255, b&255);
}
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 10; i++)
{
notrandom();
printf("\n");
}
return 0;
}
当我在Linux机器上使用GCC编译此代码并运行它时,结果却是确定性极差的:
R=0, G=19, B=0
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
如果您使用反汇编器查看编译后的代码,则可以详细重建正在发生的事情。对notrandom()的第一次调用使用了该程序先前未使用的堆栈区域;谁知道里面有什么。但是在对notrandom()的调用之后,有一个对printf()的调用(GCC编译器实际上将其优化为对putchar()的调用,但没关系),并且该操作覆盖了堆栈。因此,下一次及以后的时间,当调用notrandom()时,堆栈将包含来自执行putchar()的陈旧数据,并且由于总是使用相同的参数调用putchar(),因此该陈旧数据将始终相同,太。
因此,这种行为绝对没有任何随机性,以这种方式获得的数字也不具有编写良好的伪随机数生成器的任何理想属性。实际上,在大多数现实情况下,它们的价值将是重复的且高度相关。
的确,和其他人一样,我也将认真考虑解雇试图将这种想法称为“高性能RNG”的人。