problema generatore di numeri casuali

Salve a tutti, sono nuovo in questo campo e sto facendo i primi esperimenti con arduino.
Sono riuscito a generare un numero casuale sul monitor serial alla premuta di un pulsante, ma molto spesso mi genera sempre lo stesso numero, come potrei non far generare un numero generato in precedenza?
link per scaricare il mio programma: generatpre di numeri casuali alla premuta si un pulsante
Vi ringrazioe molto per la disponibilità

Vedi qua: random() - Arduino Reference

In particolare:

If it is important for a sequence of values generated by random() to differ, on subsequent executions of a sketch, use randomSeed() to initialize the random number generator with a fairly random input, such as analogRead() on an unconnected pin.

Essendo il tuo primo post Ti invitiamo a presentarti QUI
(dicci quali conoscenze hai di elettronica e di programmazione) e a leggere il regolamento QUI
se non lo hai già fatto.

Comunque buon anno e benvenuto sul forum.

Attilio

L'unico sistema per avere numeri realmente casuali e' di affidarsi a segnali che siano di fatto casuali ... ed in genere a piu di un segnale o meglio ancora piu di un tipo di segnali ...

Giusto come esempio ... usare una fotocellula su un pin analogico, un'NTC su un secondo, magari un microfono su un terzo, e lasciarne un quarto libero, con un pezzetto di filo collegato come antenna (basta qualche centimetro), ti fornirebbe ben 4 diversi segnali con livelli casuali e non prevedibili ... integrandoli insieme alla pressione del tasto ed usando il valore risultante come seme per il generatore di numeri random, dovresti essere abbastanza sicuro di ottenere numeri estremamente casuali.

Considera pero' anche un'altra cosa ... un VERO generatore di numeri casuali, per sua stessa natura, puo ANCHE fornire gli stessi numeri due o piu volte di seguito, proprio perche' il caso, non seguendo alcuna regola ne algoritmo, puo anche dare sequenze ordinate o ripetitive in certi casi, quindi se a volte ottieni gli stessi numeri di seguito per due volte, non e' detto che il sistema non funzioni :wink:

forse questo puo ovviare al tuo problema

Io feci un array booleano in cui verificavo se il numero fosse già stato estratto o meno...

Etemenanki stai dimenticando 3 fonti del tutto causali. Il momento del premere il pulsante, la durata dell'azionamento del pulsante e il tempo tra un azionamento e il succsivo del pulsante.

Ciao Uwe

Si, anche ... e se proprio vogliamo esagerare ,anche il numero dei rimbalzi generati dal pulsante in un tot di millisecondi :wink: ... ogni cosa e' buona, per randomizzare il piu possibile ...

Hai usato all'interno del loop l'istruzione

randomSeed(analogRead(7));

che resetta il seme del generatore pseudocasuale ad un valore tra 0 e 1023 che puoi ottenere da un ingresso analogico (A0, A1, ... A6) lasciato libero (floating).

Ma hai usato il pin 7 che corrisponde all'ingresso digitale del pulsante.

Usa invece un ingresso analogico.

Seguendo i vari suggerimenti, alla pressione del pulsante hai ottenuto un numero casuale combinando il valore di microsecondi dall'accensione, la lettura di un pezzo di filo collegato ad una porta analogica, i rimbalzi del pulsante, la resistività di un millepiedi che nuota nello zucchero filato e la lettura di un radiotelescopio puntato su una pulsar.
Bene.
A questo punto mi chiedo a cosa serva usare questo numero come seed del random, tanto vale usare questo stesso numero come numero casuale (ovviamente adattandolo al range di valori che vuoi generare).

Per rispondere alla domanda:
Se vuoi evitare di far uscire due volte lo stesso numero (come per una tombola), basta creare un array di boolean dove ad ogni indice fai corrispondere true se il numero corrispondente è già uscito. Se generi un numero che è già uscito, ripeti l'estrazione. Come ti è stato detto, è normale che generando numeri casuali si possano ottenere ripetizioni, in questi casi la cosa più pratica da fare è ripetere la generazione del numero fino a quando ne trovi uno diverso dai precedenti (tranne nei casi in cui il processo di generazione sia particolarmente lungo o costoso).

cyberhs:
Hai usato all'interno del loop l'istruzione

randomSeed(analogRead(7));

che resetta il seme del generatore pseudocasuale ad un valore tra 0 e 1023 che puoi ottenere da un ingresso analogico (A0, A1, ... A6) lasciato libero (floating).

Ma hai usato il pin 7 che corrisponde all'ingresso digitale del pulsante.

Usa invece un ingresso analogico.

Il ATmega328 in versione DIP non ha le entrate A6 e A7. lo ha solo la versione SMD.
Ciao Uwe

paulus1969:
...
A questo punto mi chiedo a cosa serva usare questo numero come seed del random, tanto vale usare questo stesso numero come numero casuale (ovviamente adattandolo al range di valori che vuoi generare)...

Usandolo come numero a se', devi rifare l'intera procedura ad ogni generazione, ed in piu sei limitato ad un certo range, usandolo come seme, il numero generato puo essere invece di qualsiasi range il generatore sia capace, inoltre in caso di necessita' (ad esempio piu processi sequenziali che necessitino di un numero casuale differente, da eseguire tutti ogni pressione del tasto) possono esserne generati piu di uno in sequenza per processi differenti, ad ogni singola pressione :wink:

Pero' sconsiglio il millepiedi nello zucchero filato, finisce sempre per mangiarselo tutto, ingrassando e abbassando la resistivita' a zero, il che manda il circuito in corto e il generatore si ferma :stuck_out_tongue: :smiley:

Hai ragione, conviene sempre far ingoiare prima al millepiedi un resistore da 4.7 k.

Che io sappia, il "generatore di numeri casuali" in realtà è una lista di numeri predeterminati, cambiare il seed serve solo a prendere un punto di partenza all'interno della lista.

Il numero casuale generato con antennine e millepiedi quindi ti fa ripartire da un punto sempre diverso di quella lista, ma in realtà hai generato un solo numero casuale.

Ovviamente se era giusta la premessa.

Piu che una "lista", si tratta in genere di algoritmi di calcolo, e ce ne sono piu tipi ... pero' la premessa e' valida, anche se solo a meta' ... se parti sempre con lo stesso seme, la sequenza di numeri sara' casuale, ma sara' sempre la stessa, come se fosse parte di una lista (differente ovviamente per ogni algoritmo), mentre se il seme e' ogni volta diverso, sara' diversa anche la "lista" (non sara' cioe' la stessa lista con un punto di partenza differente, ma proprio una lista completamente diversa ... ovviamente, ognuna di queste "liste" si ripetera', ogni volta che il suo seme sara' usato come valore iniziale ... per questo si chiamano "pseudo-random" ... ci sono in effetti dei chip che sono in grado di generare veri numeri casuali, ma anche quelli usano temperature, microsecondi, intensita' dei disturbi EM, il campionamento random della frequenza istantanea del rumore bianco di alcune giunzioni NP polarizzate, ed altre cose simili come fonti, di solito)