Pagina 1 di 2

Generare un numero random

MessaggioInviato: 1 feb 2012, 23:44
da AjKDAP
Non sapevo se scrivere qui o nella sezione informatica,

comunque volevo chiedervi se qualcuno ha qualche esempio, oppure può spiegarmi a grandi linee come viene generato un numero random.

Ad esempio il c++ con qualche libreria mette a disposizione la funzione rand() che genera uno pseudo numero random, partendo da un valore dato in pasto alla funzione.

Io nel mio piccolo lavorando con i microcontrollori andrai a cercare un input esterno, qualche elemento variabile nel tempo, non avendo a disposizione un input "umano", cercherei magari un valore di temperatura, l'inclinazione di un asse dell'accelerometro, sbaglio? :-)

La funzione rand() di prima invece sul sito cplusplus recita:

This number is generated by an algorithm that returns a sequence of apparently non-related numbers each time it is called. This algorithm uses a seed to generate the series, which should be initialized to some distinctive value using srand.


Sarei proprio curioso di capire di più sulla generazione del numero pseudo casuale :-)

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:13
da DirtyDeeds
AjKDAP ha scritto:Io nel mio piccolo lavorando con i microcontrollori andrai a cercare un input esterno, qualche elemento variabile nel tempo, non avendo a disposizione un input "umano", cercherei magari un valore di temperatura, l'inclinazione di un asse dell'accelerometro, sbaglio? :-)


Sbagli ;-)
Cercando degli input esterni, potresti finire per fare dei generatori di numeri casuali con proprietà statistiche non buone.

Meglio generare un numero pseudocasuale con un generatore che abbia passato un certo numero di test statistici. Il generatore più comune è quello a congruenza. Comunque puoi trovare maggiori informazioni nell'Handbook of mathematical functions (vai a p. 949) e nel Numerical recipes (premi Done).

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:25
da simo85
Se usi un PIC il TMR0 è sempre in esecuzione.

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:30
da DirtyDeeds
Il timer lo puoi utilizzare per generare il seme, tutt'al più, ma non per generare una sequenza di numeri casuali.

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:32
da admin
Segnalo questo articolo di Foto Utenterusty sull'argomento della generazione casuale

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:32
da TardoFreak
Si, però per ottenere il seme per il generatore di sequenze pseudo random è necessario un intervento di qualche tipo, chessò umano o comunque non prevedibile.
Il micro parte sempre allo stesso modo, il timer conta sempre gli stessi impulsi e quindi darà sempre gli stessi valori.
Se manca un evento esterno non prevedibile l' apparecchiatura produrrà sempre la stessa sequenza e questo non è bene. -:-

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:38
da AjKDAP
Grazie Foto UtenteDirtyDeeds per i links, me li leggerò!

Io il timer l'ho utilizzato per scegliere il numero di pedine nel gioco NIM bloccando il timer quando l'utente decide di iniziare il gioco, quindi ogni volta è diverso e sembra casuale.

Ma nel caso che il PIC dovesse decidere da solo il numero random, magari eseguendo l'istruzione sempre allo stesso istante dopo n secondi dall'accensione non funzionerebbe no?

EDIT: esatto, come hai detto tu tardofreak!

Grazie admin per il link, infatti mi sembrava di aver letto da qualche parte su electroyou qualche articolo!


Per ora comunque non devo implementare nulla, ma pensandoci ho iniziato a farmi qualche domanda su come funziona il tutto sui moderni sistemi informatici.

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 0:46
da IsidoroKZ
Ho usato qualche volta un generatore congruente che se ben ricordo era fatto cosi`;

X_{n+1}=(2053X_n+13849)\mod 2^{16}

Era comodo da fare su macchine a 8 bit con registri a 16 bit (ad esempio sullo Z80).

Generare il seme e` un vero casino se si vuole che abbia buone probabilita` entropiche. Ad esempio si puo` usare il rumore termico, facendo pero` attenzione ad eliminare interferenze varie, e ripeto e` un vero casino. E quando dico vero casino vuol proprio dire che e`... forse l'ho gia` detto :-)

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 1:17
da simo85
Qui si parla di generare un numero random con un PIC (8 bit).
Spero possa essere utile.

O_/

Re: Generare un numero random

MessaggioInviato: 2 feb 2012, 8:46
da TardoFreak
Confermo (qual ora ce non fosse bisogno) quello che dice Foto UtenteIsidoroKZ: generare un vero numero casuale è un gran casino. La generazione dei numeri casuali è sempre stata un problema che mi ha coinvolto direttamente e mi ha dato problemi non tanto per la sequenza (quella del C va benone) ma per ottenere il seme generatore.
L' intervento umano che cattura un contatore che viaggia a velocità folle (ma folle davvero, ordini di grandezza superiore alla velocità di reazione umana) può essere una soluzione per generare UN seme, uno solo.
Due PC o due microcontrollori assolutamente identici che viaggiano alla stessa frequenza fanno esattamente la stessa identica cosa nello stesso istante. Infatti, per avere dei simulatori di volo realistici (usando microsoft flight simulator), alcuni avevano utilizzato due PC identici che partivano insieme generando la stessa simulazione avendo come input gli stessi identici comandi e pilotando 2 o tre monitor ognuno e ... funzionavano!