Newsgroup: it.comp.lang.c++
Titolo: Numeri Casuali

Salve, esiste una funzione in C++ che genera numeri casuali, che non sia
come rand() che genera sempre la stessa sequenza di numeri casuali.
Grazie

 come rand() che genera sempre la stessa sequenza di numeri casuali.
Guarda l'help di "srand", prima.
void srand( unsigned int seed );
-- 
Luc.

 come rand() che genera sempre la stessa sequenza di numeri casuali.
Chiama randomize(time(0)) prima di chiamare rand() per la prima volta.
Claudio Puviani

 Grazie
usa srand() prima e vedrai che la sequenza cambia:
<CODE>
#include<iostream>
#include<cstdlib>
#include<ctime>
int main()
{
     int i;
     srand((unsigned)time(NULL));
     for(i=0;i<10;++i){
          std::cout << (rand()%100) << ' ';
     }
     std::cout << std::endl;
     return 0;
}
</CODE>
Vedrai che ogni volta che esegui questo codice rand() fornisce una sequenza
diversa di numeri "casuali".
Tommy
P.S. esistono modi di chiamare rand() che rendono i numeri + "casuali", ma
forse esco dal tema.....

 Chiama randomize(time(0)) prima di chiamare rand() per la prima volta.
Dove l'ho pure sentita questa..?.... E' forse VisualBasic?!?
Tommy


Non mi pare che randomize() faccia parte del C++ standard
Comunque, tornando all' OP, questo codice genera una sequenza
diversa ogni volta:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main ()
{
    // inizializza il generatore casuale con l'ora di sistema
    std::srand ( std::time(0) );
    for ( int i = 0; i < 50; ++i )
    {
        // '% 100' per generare numeri da 0 a 99
        std::cout << std::rand() % 100 << "\t" << std::rand() % 100 << "\t";
        std::cout << std::rand() % 100 << "\t" << std::rand() % 100 << "\t";
        std::cout << std::rand() % 100 <<std::endl;
        // alternativa migliore:
        // std::cout << double(std::rand()) / RAND_MAX) * 100 << std::endl;
    }
}
Se poi non bastano le (scarse) proprietą dei numeri generati da rand()
si puoi dare un occhio qui:
http://www.boost.org/libs/random/index.html
ciao
--
Gerolamo

 ha scritto nel messaggio
news:3e1afdf0$1...@nopics.sjc...


 come funziona la funzione time()?
Un manuale di C o C++ ?!?
<MSDN>
 time
Gets the system time.
time_t time( time_t *timer );
Required Header <time.h>
Return Value
time returns the time in elapsed seconds. There is no error return.
Parameter
timer
Storage location for time
Remarks
The time function returns the number of seconds elapsed since midnight
(00:00:00), January 1, 1970, coordinated universal time, according to the
system clock. The return value is stored in the location given by timer.
This parameter may be NULL, in which case the return value is not stored.
</MSDN>
Tommy

 wrote

No, è molto, ma molto peggio! Non sò com'è successo ma il mio cervello ha fatto
un salto al 1980 quando avevo un TRS-80. Non ho mai adoperato il Visual Basic,
a parte come script per Excel. Bah. Sarebbe stato peggio se avessi chiamata la
mia ragazza con il nome d'un'antecedente. :-D
Claudio Puviani


Qual è questo famoso manuale di C++ che si dovrebbe tenere sotto il cuscino,
che non sia l'Herbert Schildt?

che non sia l'Herbert Schildt?
Se ti piacciono gli incubi, compra pure i testi di Schildt.
Personalmente, uso come guanciale il testo di Bjarne Stroustrup e
quello di Stanley B. Lippman "C++ Primer" 3^ ed. (all'epoca trovai
molto interessante anche "Inside the C++ Object Model" dello stesso
Lippman, ma e` del '95, piuttosto vecchiotto).

 > Un manuale di C o C++ ?!?
il fatto che io abbia scritto questa frase ironica deriva dal fatto che
basta comprarsi un libro oppure anche solo cercare su internet.
Ad esempio digitando "C ANSI time function" ci sono moltissime pagine che
descrivono questa ed altre funzioni.
I NGs esistono, si, ma per cose banali a volte si potrebbe farne anche a
meno ;-)
Tommy

grazie ragazzi
;-)
Marta

 Per le funzioni C, tipo time() puoi anche usare il vecchio, ma saggio, K&R.
In alternativa l'ottimo Harbison - Steele, "C: A Reference Manual", 5
ed., Prentice Hall, che mette a confronto le diverse revisioni dello
standard C ed identifica chiaramente il sottoinsieme comune di C e
C++.
Direi un perfetto complemento al libro di Josuttis.
Ciao,
Nicola

si puoi dare un occhio qui:
Il punto essenziale direi che è quello: rand()/srand() sono le PEGGIORI
funzioni casuali che esistano sul pianeta... o meglio sono generatori
congrui il che di per sé non è male, ma sono stati scelti due parametri che
*non* massimizzano il "ciclo" del generatore (che potrebe essere completo,
com buoni numeri.. quindi di circa 2 miliardi di chiamate)... il cilo della
rand() mi pare si aggiri sugli 8000.
Il 'problema' è che lo Standard C prevede proprio quei parametri, quindi
rand() non può neanche essere migliorato.
Asistono tuttavia numerosi generatori "migliori"... il mio preferito è il
Mersenne Twister che ha un periodo di 2**19937-1 ed è circa 4 volte più
veloce di rand() ^_^
http://www.math.keio.ac.jp/~matumoto/emt.html
Il file è in C.. se ti serve una versione "wrappata" in una classe C++ io
l'ho fatto recentemente per un mio prgoramma, in caso chiedi pure.
--
L a p o   L u c h i n i
l a p o @ l a p o . i t
w w w . l a p o . i t /

Salve, esiste una funzione in C++ che genera numeri casuali
Dimenticavo!
Sia rand() che il Mersenne Twister generano numeri PSEUDO-casuali.
Il che significa che, per dirne una, non sono adatti per la crittografia,
che richiede veri numeri casuali.
MT invece *č* adatto a fare calcoli con metodi Monte Carlo, per esempio...
ma al massimo in spazi con 623 dimensioni.
rand() invece non č utilizzabile praticamente per niente, neanche in una o
due dimensioni...
