多くの良い答えがありますが、もう1つ追加して、決定論的コンピューターではランダムなものは何もないという点を強調しておきます。これは、疑似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」として偽装しようとした人物を解雇することも真剣に検討します。