Molte buone risposte, ma mi permettono di aggiungere un altro e sottolineare il fatto che in un computer deterministico, nulla è casuale. Questo vale sia per i numeri prodotti da uno pseudo-RNG che per i numeri apparentemente "casuali" trovati in aree di memoria riservate alle variabili locali C / C ++ nello stack.
MA ... c'è una differenza cruciale.
I numeri generati da un buon generatore pseudocasuale hanno le proprietà che li rendono statisticamente simili ai disegni veramente casuali. Ad esempio, la distribuzione è uniforme. La durata del ciclo è lunga: puoi ottenere milioni di numeri casuali prima che il ciclo si ripeta. La sequenza non è correlata automaticamente: per esempio, non inizierai a vedere emergere strani schemi se prendi ogni 2 °, 3 ° o 27 ° numero o se guardi cifre specifiche nei numeri generati.
Al contrario, i numeri "casuali" lasciati nello stack non hanno nessuna di queste proprietà. I loro valori e la loro apparente casualità dipendono interamente da come viene costruito il programma, da come viene compilato e da come viene ottimizzato dal compilatore. A titolo di esempio, ecco una variante della tua idea come programma autonomo:
#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;
}
Quando compilo questo codice con GCC su una macchina Linux ed eseguo, risulta essere deterministico piuttosto spiacevole:
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
Se guardassi il codice compilato con un disassemblatore, potresti ricostruire in dettaglio ciò che stava succedendo. La prima chiamata a notrandom () utilizzava un'area dello stack che non era stata precedentemente utilizzata da questo programma; chissà cosa c'era dentro. Ma dopo quella chiamata a notrandom (), c'è una chiamata a printf () (che il compilatore GCC effettivamente ottimizza su una chiamata a putchar (), ma non importa) e che sovrascrive lo stack. Quindi, le volte successiva e successiva, quando viene chiamato notrandom (), lo stack conterrà dati non aggiornati dall'esecuzione di putchar () e poiché putchar () viene sempre chiamato con gli stessi argomenti, questi dati non aggiornati saranno sempre gli stessi, pure.
Quindi non c'è assolutamente nulla di casuale in questo comportamento, né i numeri ottenuti in questo modo hanno le proprietà desiderabili di un generatore di numeri pseudocasuali ben scritto. In effetti, nella maggior parte degli scenari della vita reale, i loro valori saranno ripetitivi e altamente correlati.
In effetti, come altri, prenderei seriamente in considerazione l'idea di licenziare qualcuno che ha cercato di far passare questa idea come un "RNG ad alte prestazioni".