많은 좋은 답변이지만 다른 것을 추가하고 결정 론적 컴퓨터에서는 무작위가 없다는 점을 강조 할 수 있습니다. 이는 의사 -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"로 전달하려는 누군가를 해고 할 것을 진지하게 고려할 것입니다.