Bug di random() ?

Stavo costruendo il circuito con l'LCD del kit base. Ad un certo punto il codice assegna ad una variabile A il valore random(B) (A = random(B):wink: quando si preme un pulsante. Il problema è che ogni volta che si fa il reset del circuito e si preme il pulsante il primo valore assegnato ad A è sempre il valore B, poi premendolo nuovamente il valore diventa veramente casuale. Può essere un bug o manca qualcosa nel codice?

Devi cambiare seme al random altrimenti la sequenza è sempre identica.
--> http://arduino.cc/en/Reference/RandomSeed

La random() di Arduino è una pseudo-random che, dato un numero iniziale, produce sempre la stessa sequenza ...

Ti consiglio di studiarti la libreria scritta da Leo che trovi QUI che, almeno, garantisce una migliore casualità (... pur essendo sempre una pseudo-random) :wink:

Guglielmo

Curiosità tecnica: aggiungere uno start manuale e moltiplicare il risultato per millis(), ovviamente con la corretta tipologia di variabile non la renderebbe una quasi random reale, secondo Voi?

Mah ... purché il seed number sia sempre diverso ... direi quasi di SI.

Però ... ricordiamo che :

randomSeed() initializes the pseudo-random number generator, causing it to start at an arbitrary point in its random sequence.

e che :

This sequence, while very long, and random, is always the same.

Quindi ... prima o poi la sequenza si ripete ...

Guglielmo

Sono stufo che ogni volta che qualcuno scorpe qualcosa di strano é un errore del Arduino e non si informa di come dovrebbero funzionare le cose. Il funzionamento del random é documentato e spiegato.
per esempio: http://arduino.cc/en/Reference/Random
Ciao Uwe

Spero tu non ce l'abbia con me UWE, io ho solo suggerito una possibilità......

@ Guglielmo, se moltiplichi una sequenza di valori per un valore sempre diverso come fa a ripetersi questa sequenza? Cioè se io avvio la procedura e ad un certo punto premo un pulsante, in quell'istante il random restituisce un valore che moltiplico per il valore di millis() di quello stesso istante; quando il random ripeterà la procedura perché dovrebbe incontrare nuovamente lo stesso valore di millis()? Sono inesperto in programmazione quindi sto usando la logica applicata alle mie poche conoscenze, per cui perdona eventuali blasfemità :confused:

Michele,
come detto :

randomSeed() initializes the pseudo-random number generator, causing it to start at an arbitrary point in its random sequence.

e :

This sequence, while very long, and random, is always the same.

quindi, sembrerebbe che il seed number è solo un entry point in una sequenza di numeri, mooooolto lunga, ma ... comunque sempre la stessa quindi ... NON infinita e, pertanto, prima o poi si ripete.

Non per nulla è un pseudo-random.

Se vuoi un generatore di bit "random" ... puoi però usare lo schema che ti allego ... :smiley: :smiley: :smiley:

Guglielmo

random.gif

Guglielmo, io ho letto bene quello che hai detto, perfino la parte in inglese e quindi per convincerti che ho capito ti faccio un esempio basato su pochi numeri:
la sequenza è: 8-4-9-2-3-1, ma io posso partire da un punto qualsiasi, p.es. 9-2-3-1-8-4 oppure 3-1-8-4-9-2.
Ora immaginiamo che i numeri siano 4 milioni ma il succo non cambia, giusto?
Bene restiamo su questi soli sei numeri immaginandoli come risultati del random ciclico, crea un loop di questo tipo:
9millis()
2
millis()
3millis()
.....
4
millis()

sei d'accordo con me o no che ogni volta che il random ricomincia il 9*millis() darà un valore diverso e quindi la sequenza diventa pressoché infinita?

Aha ... ok, ho capito cosa intendi ...

... l'unico problema che vedo è che, ad ogni accensione del sistema, millis() riparte da zero e quindi ... occorre fare in modo di aspettare un "tempo casuale" MANUALE (... il tuo "start manuale") prima di cominciare :wink:

Guglielmo

Ed infatti lo start manuale l'ho previsto da subito, basta un solo millisecondo di differenza da una volta all'altra :wink:
In alternativa si potrebbe ricorrere al principio del tuo schema.... si mette su un pin analogico un circuitino RC e fai partire il random quando il pin raggiunge un dato valore di tensione di carica; considerando quanti fattori entrano in ballo nella carica di un condensatore ti risparmi anche la fatica di premere il pulsante :wink:

Oppure compri un generatore di numeri casuali per 3$
--> SparkFun Authentication Chip Breakout - ATSHA204 - BOB-11551 - SparkFun Electronics

... e se vuoi fare il cattivo e moltiplicare per mille il possibile scostamento random, usa micros invece di millis, ed un condensatore ceramico multistrato da 470nF di quelli gialli economici che si usano come filtri per le alimentazioni ... sono talmente sensibili alla temperatura ambente, che una volta ci avevo costruito un termometro usandone uno come sensore ... da 5 a 60 gradi cambiava valore del 40% (alla faccia della stabilita' termica :stuck_out_tongue: :smiley: :smiley: :D)

azz, ci sono talmente tante variabili che secondo me alla fine, col principio dei poli opposti dell'infinito, torniamo al punto di partenza e cioè che funzionerà tutto esattamente come la sola Random, e cioè il ciclo diventerà ripetitivo :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Etemenanki:
ed un condensatore ceramico multistrato da 470nF di quelli gialli economici che si usano come filtri

Il generatore di numeri random perfetto è un bicchiere riempito a metà con della birra, chi capisce il perché vince un caffè :smiley:

L'altra metà è già in azione nel cervello dell'utente? :grin:

Ha a che fare con la tolleranza alcoolica individuale, o con il conteggio delle bollicine ? ... :stuck_out_tongue: :smiley:

Etemenanki:
Ha a che fare con la tolleranza alcoolica individuale, o con il conteggio delle bollicine ? ... :stuck_out_tongue: :smiley:

Buona la seconda :slight_smile:

avendo un analogico libero lo si lascia float e lo si usa come seme :slight_smile:
se le bollicine influenzano il pin float ancora meglio

Testato:
...
se le bollicine influenzano il pin float ancora meglio

Si, ma come colleghi il pin al bicchiere ? ... o immergi semplicemente lo stampato nella birra, ed aspetti che la MCU ne assorba a sufficenza da ubriacarsi ?

:stuck_out_tongue: :smiley: