Newsgroup: it.comp.lang.c++
Titolo: generazione numeri casuali [min-max]

ciao, nelle FAQ ho trovato questo suggerimento per la generazione di numeri
casuali:
int un_po_meglio_fra_0_e_99() {
    static const double divisore = (1.0 + RAND_MAX)*100.0;
    return static_cast<int>(rand()/divisore);
}
il problema e' che non riesco a capire come si estenda a numeri casuali
entro un intervallo generico min-max.
forse e':
int un_po_meglio_fra_MIN_e_MAX() {
    static const double divisore = ((float)(MIN+1) +
RAND_MAX)*(float)(MAX+1);
    return static_cast<int>(rand()/divisore);
}
oppure no? boh....
scusate se la domanda e' sciocca, ma non c'arrivo!
Un'altra questione: srand() per l'inizializzazione *quando* devo usarlo?
una volta in tutto il programma?
<OT>
e se il programma e' composto da piu' thread (nello stesso processo)?
basta ancora una volta sola?
</OT>
grazie!
--
Ciao by Allanon

 Ciao by Allanon
Cesare

 andare da 0 a n, basta passare rand a modulo con n + 1.
Peccato che, come ampiamente ricordato nelle FAQ, questo distrugga le
propriet`a statistiche dei numeri; ad esempio e' usuale, con le
sequenze dei generatori inclusi nei compilatori, che rand()%2 dia
sequenze 0,1,0,1,0,1,0,1,... niente affatto casuali.  Il metodo citato
dall'OP e' quello consigliato.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 dall'OP e' quello consigliato.
ciao, sono l'OP :-)
sapresti dirmi quindi come generalizzare ad un intervallo MIN MAX?
e' forse giusto quello che ho scritto?
grazie!
Ciao by Allanon

 writes:

Si - se ricordo bene, avevi scritto qualcosa del tipo
#include <cstdlib>
int randInt(int minimo, int intervallo) {
  // Restituisce un intero scelto a caso tra "minimo" (incluso) e
  // "minimo"+"intervallo" (escluso).
  double x = rand() / (RAND_MAX + 1.0)              // 0.0 <= x < 1.0
                                                    // con probabilita'
                                                    // uniforme
  return (minimo + x * intervallo);
}
Chiaro che, se si tratta di un giochino o se non ti interessa una
elevata qualita' statistica della sequenza, anche
minimo+rand()%intervallo da' lo stesso risultato.


 dall'OP e' quello consigliato.
E allora srand() a cosa serve se non a casualizzare i numeri?
Cesare


 E allora srand() a cosa serve se non a casualizzare i numeri?
Onde evitare fraintendimenti, specifico meglio il mio post precedente... nel
mess in cui avevo risposto alla domanda avevo sottolineato l'uso di srand(),
senza il quale č chiaro che rand() genera sequenze uguali di numeri casuali,
ovvero genera numri pseudo-casuali.
La funzione srand() accetta un seme sul quale poi rand(9 genera sempre la
medesima sequenza di numeri, casuali, inserendo srand( time( 0 ) ), srand()
definisce un seme sulla base dei secondi trascorsi, quindi la generazione di
fatto diventa del tutto casuale poi.
Cesare


 E allora srand() a cosa serve se non a casualizzare i numeri?
rand() genera una sequenza di numeri *pseudo*-casuali; cioe'
ripetibile, ma le cui proprieta' statistiche sono indistinguibili da
quelle di una vera sequenza casuale.
srand() serve a cambiare la sequenza, inizializzando differentemente
il generatore.
