Newsgroup: it.comp.lang.c++
Titolo: FAQ su numeri casuali?

Credo che si potrebbe aggiungere questa faq, mi pare
che le domande in merito siano abbastanza frequenti.
Se avete link e risposte da dare, replicate pure a questo
messaggio.
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

 messaggio.
A questo indirizzo 
http://www.math.keio.ac.jp/~matumoto/emt.html
 si
trova un'implementazione del Mersenne Twister.
EMG

 messaggio.
a. come faccio a generare numeri casuali?
    La funzione standard rand(), ottenuta con #include <stdlib.h>,
    torna numeri interi pseudo-casuali fra 0 e RAND_MAX (che di
    solito vale 32767 o giu` di li`).  Non sono sequenze di grande
    qualita` da nessun punto di vista, ma possono servire.
    Per necessita` piu` spinte, in termini di qualita` della
    sequenza, vedi d.
b. perche` mi torna la stessa sequenza di numeri casuali ogni
    volta che eseguo il mio programma?!
    Hai scordato di chiamare la funzione standard srand() per
    inizializzare il generatore di numeri casuali.  Come argomento
    di srand(), usa ad esempio uno che dipende dall'orologio...:
#include <stdlib.h>
#include <time.h>
    ...
   srand(reinterpret_cast<unsigned>(time(0)));
c. ma io non voglio interi fra 0 e 32767, bensi` fra 0 e 99,
    come faccio?
    *NON* fare:
    int random_fra_0_e_99() {
        return rand() % 100;
    }
    che peggiora ulteriormente la gia` scarsa qualita` del
    generatore di rand()...!!!  (rand() e` normalmente
    linear-congruenziale, e i bit bassi di questi numeri
    sono peggiori; con l'operatore modulo, usi proprio
    questi bit bassi).
    Usa piuttosto:
    int un_po_meglio_fra_0_e_99() {
        static const double divisore = 1.0 + RAND_MAX;
        return static_cast<int>(rand()/(divisore * 100.0));
    }
d.  ho bisogno di una sequenza di numeri casuali di
     alta qualita` (e/o, numeri casuali con una qualche
     distribuzione non uniforme), come faccio?
 
http://csep1.phy.ornl.gov/rn/rn.html
 
http://random.mat.sbg.ac.at/
 
http://www.math.keio.ac.jp/~matumoto/emt.html
 
http://nhse.npac.syr.edu/random/
 
http://www.taygeta.com/random.xml
 
http://lavarand.sgi.com/
 
http://www.fourmilab.ch/hotbits/
 
http://www.ncsa.uiuc.edu/Apps/CMP/RNG/mascagni/www-rng.html
 
http://random.mat.sbg.ac.at/ftp/pub/data/winrand.zip
 
http://webnz.com/robert/nzc_nr02.html
Questo piccolo elenco comprende sia testi di teoria (per quelli
che hanno lo strano vizio di voler capire quello che fanno!-),
sia software gia` fatto, sia generatori hardware (non pseudo,
ma VERI numeri casuali) accessibili via rete.
Alex

#include <time.h>
          <ctime>
Tanto per seguire lo std, anche se magari non tutti lo seguono.
--
 (o-  | c:\> win2000patch001.exe
 //\  | This Microsoft(c) patch fix all bugs present. All rigth reserved.
 V_/_ | Insert Linux boot disk to continue ... loading kernel ...
http://pinguin.linuxbox.com
 r.salmaso(at)
flashnet.it

 Tanto per seguire lo std, anche se magari non tutti lo seguono.
Gli #include degli header previsti dallo standard C non violano
lo standard C++ (in altri termini, un programma C++ puo`
essere _strictly_ compliant anche con #include <stdlib.h> e
cosi` via).  In questo caso, non mi pare che i minuscoli ed
eventuali vantaggi di #include <cstdlib> "valgano la candela"
di diminuire la portabilita` del proprio programma.
Alex

Ottimo... praticamente mi basta un cut&paste :)





di diminuire la portabilita` del proprio programma.
Qualcosina di non standard C negli esempi c'era 
(i cast C++  ;-)



 Dei semplici ed efficaci generatori si possono trovare nel libro:
   Numerical Recipes in C William Press che è disponibile anche on-line (in
  formato pdf  e ps).
   L'indirizzo è:
http://www.ulib.org/webRoot/Numerical_Recipes/bookcpdf.html/
   Il capitolo è il settimo (in particolare il file c7-1.pdf)
  Nota: l'interfaccia di questi generatori non è molto buona (sono in C).
  A chi è interessato posso fornire la mia implementazione in C++.
Manlio Perillo