Buongiorno a tutti, cercavo un metodo per creare numeri casuali senza l'utilizzo di rand(), credo che non esista, ma se per caso conoscete un modo, ditemelo. Grazie in anticipo.
Buongiorno a tutti, cercavo un metodo per creare numeri casuali senza l'utilizzo di rand(), credo che non esista, ma se per caso conoscete un modo, ditemelo. Grazie in anticipo.
Ultima modifica di pierobonluca01; 07-04-2016 a 18:27
Quel "credo che non esista" mi sembra che sia del tutto sbagliato, perché se è possibile realizzarlo tramite una funzione si può realizzare anche tramite un algoritmo scritto da sé.
Se non sbaglio è una procedura un po' particolare che utilizza l'orologio interno del computer (avendo un output variabile nel tempo) per dare in uscita un numero che varia al variare nel tempo, in modo che ogni istante crei un valore sempre diverso.
Ora non posso dirti più di tanto, perciò ti consiglio di leggerti questo: https://it.wikipedia.org/wiki/Numeri_pseudo-casuali
Oppure prova con un pdf: http://www.dia.uniroma3.it/~adacher/...ioneRandom.pdf
P.S: la generazione di un numero casuale non è una cosa poi così semplice![]()
Ci sono svariati metodi che sfruttano principi algebrici, per cui in realtà la sequenza di numeri a partire da uno stesso numero è deterministica. E' per questo che spesso si utilizzano dati esterni per "sporcare", come orario corrente, posizione del mouse, ...
Il metodo più semplice è questocodice:int mod = qualcosa_di_grande; //possibilmente con determinate caratteristiche per offrire una distribuzione migliore int seed = ...; int mul = ...; int inc = ...; int rand() { seed = (mul*seed+inc)%mod; return seed; }
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
rand() in genere è semplicemente un LCG (l'algoritmo sopra descritto da scara95), in cui il seed (ovvero, il numero di partenza con cui viene inizializzato l'algoritmo) viene impostato tramite srand (in genere a partire dall'ora corrente o da altri dati sempre diversi ad ogni avvio del programma).
Giusto per rendere l'idea, lo stesso standard C fornisce un'implementazione di esempio, che come si vede è semplicissima:
Nota comunque che esiste di molto meglio, sia in termini di generatori di numeri pseudo-casuali (ad esempio, il Mersenne Twister è uno dei generatori "di alta qualità" più diffusi) che di sorgenti di entropia (sotto Linux ad esempio /dev/random fornisce piccole quantità di byte casuali ottenuti da varie sorgenti di entropia da usare come seed per PRNG).codice:static unsigned long int next = 1; int rand(void) // RAND_MAX assumed to be 32767 { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } void srand(unsigned int seed) { next = seed; }
Ultima modifica di MItaly; 09-04-2016 a 01:36
Amaro C++, il gusto pieno dell'undefined behavior.