PDA

View Full Version : [C++] Output differente dallo stesso input (senza uso di srand() )


sylvaticus
09-02-2008, 08:17
ciao... ho un dubbio sulla mia applicazione in C++..
Usando lo stesso input, sulla stessa macchina, senza ricompilare, il più delle volte ottengo degli output molto, molto (ma non del tutto) simili ma talvolta ottengo output "abbastanza" diversi.
Uso estensivamente l'algoritmo STL random_shuffle() ed a volte le chiamate a rand() ma non "resetto" mai il seme con srand(). Come può essere ???

Può dipendere da una libreria esterna che utilizzo per l'ottimizzazione matematica (GLPK) ???

Grazie a quanti sapranno indicarmi un punto dal quale partire...

un saluto,
sylvaticus

gugoXX
09-02-2008, 09:14
Non ho ben capito cosa vorresti.
Se li vuoi uguali tutte le volte (tipicamente per test), allora piazza uno srand fisso all'inizio (ES: srand(144);)
Se invece li vuoi "diversi" tutte le volte piazzaci uno
srand ( time(NULL) );
O comunque uno srand diverso di volta in volta. Tipicamente si usano valori del timer, o numero di secondi a partire dalla tua data di nascita, o altro...

sylvaticus
09-02-2008, 11:57
Non ho ben capito cosa vorresti.
Se li vuoi uguali tutte le volte (tipicamente per test), allora piazza uno srand fisso all'inizio (ES: srand(144);)
Se invece li vuoi "diversi" tutte le volte piazzaci uno
srand ( time(NULL) );
O comunque uno srand diverso di volta in volta. Tipicamente si usano valori del timer, o numero di secondi a partire dalla tua data di nascita, o altro...

no.. io li vorrei tutti uguali e non ho nessuna chiamata a srand().
Questo credo equivalga a fare una chiamata a srand "fisso"...

Il problema è che nonostante non abbia nessun srand() i risultati mi vengono diversi a parità di input :-(((

gugoXX
09-02-2008, 12:00
Be, prova a piazzare uno srand fisso, oppure prova a vedere se la liberia offre una chiamata analoga.

sylvaticus
09-02-2008, 12:21
Be, prova a piazzare uno srand fisso, oppure prova a vedere se la liberia offre una chiamata analoga.

..grazie.. ora sto provando con uno fisso (avevo provato inserendo srand(1) ogni volta che chiamavo rand(), ma era sbagliato..)

cionci
09-02-2008, 12:35
..grazie.. ora sto provando con uno fisso (avevo provato inserendo srand(1) ogni volta che chiamavo rand(), ma era sbagliato..)
Devi fare srand(1) solo una volta all'inizio del tuo programma.

sylvaticus
09-02-2008, 18:28
fatto, ma inutile. Continua a dare risultati uguali alla virgola nel 20% dei casi e leggermente differenti nel restante 80%... :-(((

wizard1993
09-02-2008, 22:01
fatto, ma inutile. Continua a dare risultati uguali alla virgola nel 20% dei casi e leggermente differenti nel restante 80%... :-(((

posta se puoi il tuo codice

sylvaticus
09-02-2008, 23:21
posta se puoi il tuo codice

Sono riuscito ad isolare il problema ( o almeno credo)..

Spesso utilizzo delle chiamate a rand() simili a quelle in questo loop:


double ddebug;
uint idebug=0;
double debugmin = 0;
double debugmax = 1000;
for (uint i=0;i<10000;i++){
ddebug += debugmin + ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) )*(debugmax-debugmin+1);
}
idebug = ddebug;
std::cout << "idebug: "<<idebug<<std::endl;


La cosa strana è che utilizzo questo codice subito dopo il main() mi dà sempre lo stesso risultato, ma se lo metto, anche all'inizio, del mio "run()" a volte mi sgarra numero..
Utilizzo le Qt4 ed ho provato ad inserirlo nel run() dell'esempio del mandelbrot, e pure lì ogni tanto "sgarra".
E' un problema delle Qt ????

^TiGeRShArK^
10-02-2008, 03:01
Sono riuscito ad isolare il problema ( o almeno credo)..

Spesso utilizzo delle chiamate a rand() simili a quelle in questo loop:


double ddebug;
uint idebug=0;
double debugmin = 0;
double debugmax = 1000;
for (uint i=0;i<10000;i++){
ddebug += debugmin + ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) )*(debugmax-debugmin+1);
}
idebug = ddebug;
std::cout << "idebug: "<<idebug<<std::endl;


La cosa strana è che utilizzo questo codice subito dopo il main() mi dà sempre lo stesso risultato, ma se lo metto, anche all'inizio, del mio "run()" a volte mi sgarra numero..
Utilizzo le Qt4 ed ho provato ad inserirlo nel run() dell'esempio del mandelbrot, e pure lì ogni tanto "sgarra".
E' un problema delle Qt ????
ehmm...
non ho idea..
ma solitamente gli EDT (Ebent Diapstcher Thread) delle librerie grafiche non sono mai un buon posto dove metere del codice che non ha niente a che fare con l'interfaccia grafica :fagiano:

sylvaticus
10-02-2008, 11:41
ehmm...
non ho idea..
ma solitamente gli EDT (Ebent Diapstcher Thread) delle librerie grafiche non sono mai un buon posto dove metere del codice che non ha niente a che fare con l'interfaccia grafica :fagiano:

Accidenti.. in effetti riscrivendo il main() in modo da "saltare" la GUI mi funzia..
Vuol dire che c'è qualcosa nella GUI che gli da fastidio.. ma qual'è allora un approccio corretto in un modello dove la GUI serve solo per "visualizzare" lo stato di un modello e farlo partire con i soliti start/pause/stop ???
Ero riuscito a fare due thread separati, uno per la GUI ed uno per il modello, ma vedo che condividendo l'area di memoria se c'è una qualche cappella nella GUI questa può propagarsi nel modello... :(

cionci
10-02-2008, 11:49
La prima soluzione che mi viene in mente è: usa un generatore di numeri casuali indipendente da quello della libreria standard. Almeno te lo gestisci come ti pare.
Ne trovi tanti online.