Voglio creare un programma che richiede solo un numero casuale, quindi cerco di usare l'indirizzo di argc nella funzione principale come sorgente casuale perché penso che la posizione del programma in memoria sia casuale, e inoltre possa salvare alcuni di essi dichiarazioni, quindi ho provato:Posso usare l'indirizzo di argc in main come sorgente casuale?
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int));
return 0;
}
ma ho trovato l'uscita in ogni tempo non è molto "random": sono multipli di 4:
17591828907268
17591841542404
17591845040388
17591834556676
Qual è la ragione? E sta usando l'indirizzo di argc come numero casuale possibile?
poi cerco rimuovere alcuni bit dell'indirizzo:
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv >> 12);
return 0;
}
sembra abbastanza casuale questa volta, almeno ha sia numeri pari e dispari:
34359070631
34359034616
34359078055
34359080624
è che "corretto" modo per trasformare l'indirizzo di argc in un numero casuale?
Stai chiedendo se '& argc' è un buon seme da usare per' srand() '? –
È improbabile che la posizione del programma in memoria sia casuale. Il sistema operativo utilizza un algoritmo per determinare la posizione in memoria del programma e quell'algoritmo riflette una strategia scelta dal sistema operativo. – Dko
Non esiste realmente un "numero casuale". Ci sono sequenze casuali di numeri. Se è necessario un solo numero per ogni esecuzione del programma, è necessario sceglierlo da una sequenza generata al di fuori del programma. La proposta di John Hascall di/dev/random è una scelta eccellente. Qualcosa come random.com è un altro. –