Newsgroup: it.hobby.elettronica.digitale
Titolo: rand() e valori minimi/massimi

Ciao,
ho un piccolo AVR (ATTiny25) che vorrei generasse numeri pseudo-casuali 
tramite la funzione rand().
Su architetture piï¿œ performanti per scalare i valori restituiti 
(compresi tra 0 e RAND_MAX = 0x7FFF) tra VAL_MIN e VAL_MAX faccio cosï¿œ:
out = VAL_MIN + rand() * (VAL_MAX / RAND_MAX)
dove VAL_MIN e VAL_MAX sono costanti.
perï¿œ questo implica dei calcoli di tipo di tipo float visto che il 
rapporto VAL_MAX / RAND_MAX ï¿œ tipicamente < 1.
Potrei fare  cosï¿œ:
out = VAL_MIN + (rand() * VAL_MAX) / RAND_MAX
ma in questo caso devo comunque effettuare un cast a causa dell'overflow 
dovuto alla moltiplicazione e non ci sto dentro, visto che giï¿œ uso 
interi a 16 bit perchï¿œ ï¿œ moltiplicato tutto per 100.
Insomma, c'ï¿œ un trucco per limitare la generazione dei numeri casuali 
entro un certo intervallo utilizzando solo interi a 16 bit? Ad ogni modo 
non mi serve una perfetta linearitï¿œ, anche un'approssimazione del 10% mi 
sta bene.
Marco

 out = VAL_MIN + (rand() * VAL_MAX) / RAND_MAX
O forse cosï¿œ?
out = VAL_MIN + rand() % (VAL_MAX - VAL_MIN);
Non sarï¿œ il massimo perï¿œ occupa molto meno spazio...
Marco

 out = VAL_MIN + rand() * (VAL_MAX / RAND_MAX)
Ma scusa rand() di solito non ï¿œ uniforme tra 0 e 1? Se ï¿œ cosï¿œ, 
chettefrega dividere?
out=VAL_MIN + (VAL_MAX-VAL_MIN)*rand();
ammesso che VAL_MIN!=0.
Cosa mi sfugge?
Ciao
Pasu

 Cosa mi sfugge?
Ovviamente mi sfugge tutto... Scusa avevo letto una riga sï¿œ ed una no 
del tuo post.
Se rand() genera numeri tra 0x0000 e 0x7FFF basta mascherare "i bit di 
troppo": la distribuzione ï¿œ uniforme, ergo tutti i 15 bit hanno 
distribuzione uniforme. Se ad esempio a te servono 256 valori basta 
prendere il LSB. Comunque tieni presente che se moltiplichi ottieni dei 
"buchi" (valori che non usciranno mai).
Se invece ti serve un numero *leggermente* piï¿œ piccolo di 256 (o altra 
potenza di 2), ad esempio 200 puoi mettere una condizione che fa 
"rilanciare il dado" se esce un valore maggiore di 200: la distribuzione 
rimane inalterata (amenochï¿œ non sei tra quelli che giocano i numeri 
ritardatari al Lotto :-).
Ciao e scusa per il mio post precedente
P.

 ritardatari al Lotto :-).
Il punto ï¿œ che volevo avere una soluzione generica con qualsiasi estremi 
di minimo e massimo. Ovviamente ha senso se si possono usare i float... 
altrimenti mi sa che ogni caso va trattato a se.
E no, non gioco al Lotto e non giocherei sui ritardatari :)
Marco

 E no, non gioco al Lotto e non giocherei sui ritardatari :)
Ne ero certo, almeno per la seconda parte :-)
Pasu

 Perï¿œ ho verificato che per i miei scopi ï¿œ sufficiente :)
Beh, allora non ci sono problemi :-)
In ogni caso ricorda che se non inizializzi il generatore con un seme 
abbastanza casuale, la sequenza generata sarï¿œ sempre la stessa. Magari 
ti va bene lo stesso ma tienilo presente.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 ti va bene lo stesso ma tienilo presente.
Di solito aggancio il seme al valore assunto dal timer al momento della 
pressione di un tasto. In questo caso specifico prendo il valore di due 
timer a 8 bit (ottenendo quindi un int16) al momento dell'attivazione 
della funzione che comporta la generazione dei numeri casuali.
Ciao!
Marco

 Ma per curiositï¿œ che tipo di estremi (min e max) hai in mente?
Nel progetto corrente avrei alcuni facilissimi giusti di 1 byte, quindi 
0-255 e non ci sono problemi.
Poi avrei un 150-25000 e un 3000-4000.
Ciao!
Marco

 Poi avrei un 150-25000 e un 3000-4000.
Ho trovato idee molto interessanti su The art of computer programming
vol. 2. Knuth tra l'altro descrive un semplicissimo e furbissimo algoritmo
in grado di migliorare enormente la casualit� di qualunque generatore
random, facendo uso solo di un piccolo array di int e operazioni di
indicizzazione e scambio. Io l'ho provato anche con un generatore
di numeri non casuali (0,1,2,3,4,5...) con risultati stupefacenti.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 vol. 2. 
Vedo se riesco a trovarlo in biblioteca!
Grazie della segnalazione
Marco

 Vedo se riesco a trovarlo in biblioteca!
Confermo, se vuoi approfondire l'argomento, il libro di Knut ï¿œ la bibbia!


 Confermo, se vuoi approfondire l'argomento, il libro di Knut � la bibbia!
Personalmente nutro un'ammirazione sconfinata per questo eclettico
ultrasettantenne
http://www-cs-faculty.stanford.edu/~knuth/
Consiglio a chiunque abbia a che fare con la programmazione di leggere
i suoi libri. Si trovano facilmente in rete, ma sono sicuro che poi vorrete
averne una copia reale stampata su carta con pH 7,8 e vita presumibile
di diverse centinaia di anni.
