 
View Full Version : [C++] random in un for
Kralizek
18-03-2003, 20:16
devo calcolare una serie di random tra 3 e 18 (circa una ventina) e ho notato che mi escono tutti valori uguali anche usando il time di sistema come seme per la randomizzazione... come devo fare?
facendo
#include <time.h>
for (int i=0;i<n; i++){
  time_t seme;
  seme=time();
  srand(&seme);
  x[i]=rand(); // vettore di uscita
}
il programma lavora in funzione del tempo, ma essendo il for un'operazione abbastanza veloce... il tempo non passa!!!
srand((unsigned)time(NULL)); 
for (int i=0;i<n; i++){ 
  x[i]=rand(); // vettore di uscita 
} 
Non importa inizializzare ogni volta il generatore di numeri casuali...anzi andrebbe inizializzato una sola volta in tutto il programma...
Kralizek
19-03-2003, 00:25
il problema è che i numeri continuano ad essere uguali...
non genera numeri diversi...
è stressante...
 :cry:  :cry:  :cry:
Non mi ricordo il C++ tanto bene ma nn potresti fare un randomize
#include <time.h>
#include <stdlib.h>
randomize();
for(i=0;i<n;i++)
{
  x[i]=random(16)+3; //random da 0 a 15 (+3 = 3 a 18)
}
Dimmi se ti va  :p
/\/\@®¢Ø
19-03-2003, 09:39
Originally posted by "Kralizek"
devo calcolare una serie di random tra 3 e 18 (circa una ventina) e ho notato che mi escono tutti valori uguali anche usando il time di sistema come seme per la randomizzazione... come devo fare?
facendo
#include <time.h>
for (int i=0;i<n; i++){
  time_t seme;
  seme=time();
  srand(&seme);
  x[i]=rand(); // vettore di uscita
}
il programma lavora in funzione del tempo, ma essendo il for un'operazione abbastanza veloce... il tempo non passa!!!
le funzioni rand non sono adatte alla generazione di valori casuali troppo ravvicinati (con le attuali macchine, molto veloci). Ti conviene passare a qualche altra libreria ( ad esempio trovi diversi generatori casuali nelle librerie boost http://www.boost.org ).
Se ti basta un generatore pseudo-casuale ( deterministico quindi ), la seguente dovrebbe funzionare bene (non chiedermi dove l'ho presa... ormai non lo ricordo piu' :D :p )
#define a15 452807053
#define mask INT_MAX
int clock_seed()
{
    int seed;
    unsigned int st;
    time_t times;
    times = time(0);
    st = (unsigned int) times / 2;
    seed = (int) st;
    return ( ((seed%2) == 0) ? seed+1 : seed );
}
int rnd7()
{
    static int IX = clock_seed();
    IX = IX * a15;
    return((IX < 0)? IX & mask : IX);
}
( La funzione ritorna un intero casuale, per ottenere un float basta che fai una conversione e una scalatura, su macchine a 32bit la distribuzione di float risultante e' in generale buona)
srand((unsigned)time(NULL)); 
for (int i=0;i<n; i++){ 
  x[i]=rand(); // vettore di uscita 
} 
A me così torna numeri diversi...
Sia con VC++ che con Mingw GCC...
Ho un 1800+...
/\/\@®¢Ø
19-03-2003, 10:22
Originally posted by "cionci"
srand((unsigned)time(NULL)); 
for (int i=0;i<n; i++){ 
  x[i]=rand(); // vettore di uscita 
} 
A me così torna numeri diversi...
Sia con VC++ che con Mingw GCC...
Ho un 1800+...
Dipende dalla libreria C utilizzata penso, io un po' di tempo fa avevo avuto problemi invece...
Originally posted by "/\/\@®¢Ø"
Dipende dalla libreria C utilizzata penso, io un po' di tempo fa avevo avuto problemi invece...
Chiaro...è per quelo che ho specificato il compilatore ;)
/\/\@®¢Ø
19-03-2003, 10:40
ah...dimenticavo... nel mio caso mi servivano float e quindi probabilmente era nella conversione che la distribuzione omogenea andava a farsi benedire
~Blissard~
20-03-2003, 19:16
Una volta avevo fatto un prog che generava numeri sempre diversi salvando quelli non ancora "estratti" in un vettore dinamico che ad ogni estrazione veniva letto e confrontava il nuovo numero, non è il massimo dell ottimizzazione però funzionava ed era abbastanza simile a quello postato inizialmente basta aggiungere il vettore e la funzione di confronto  ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.