Hai introdotto degli argomenti che non conoscevo, cmq da una rapida lettura della documentazione mi sembra di capire che per evitare di inizializzare il seme sempre allo stesso valore vai a considerare oltre ai secondi anche i millisecondi.
Così su due piedi ti direi che ha senso, ma non sapendo cosa realmente succede nella pratica ho provato a fare qualche esperimento:
Con questo codice
#include <iostream>
#include <cstdlib>
#include <sys/time.h>
using namespace std;
class dado
{
public:
dado()
{
struct timeval time;
gettimeofday(&time,NULL);
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
}
unsigned int effettua_lancio()
{
return rand() % 6 + 1;
}
};
int main()
{
for(unsigned int i = 0; i < 10; ++i)
{
dado a;
for(unsigned int j = 0; j < 10; ++j)
{
cout << a.effettua_lancio() << "\t";
}
cout << endl;
}
}
ottengo
4 1 4 5 5 6 2 1 2 4
5 5 1 4 6 6 3 2 5 4
2 6 3 5 5 2 2 3 2 6
5 2 3 6 5 5 6 4 2 2
3 5 5 4 6 2 4 6 6 4
6 5 5 5 4 5 3 1 5 6
3 1 1 6 5 5 1 2 3 4
1 4 2 2 6 2 6 2 6 6
4 4 2 5 4 5 4 3 6 2
1 1 4 6 5 1 3 4 3 4
Process returned 0 (0x0) execution time : 0.933 s
Press any key to continue.
e sembra funzionare.
Con questo codice invece
#include <iostream>
#include <cstdlib>
#include <sys/time.h>
using namespace std;
class dado
{
public:
dado()
{
struct timeval time;
gettimeofday(&time,NULL);
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
}
unsigned int effettua_lancio()
{
return rand() % 6 + 1;
}
};
int main()
{
for(unsigned int i = 0; i < 30; ++i)
{
dado a;
for(unsigned int j = 0; j < 1; ++j)
{
cout << a.effettua_lancio() << "\t";
}
cout << endl;
}
}
ottengo il seguente output
5
5
2
2
2
2
2
2
2
2
6
6
6
6
6
6
6
6
6
3
3
3
3
3
3
6
6
3
3
1
Process returned 0 (0x0) execution time : 0.022 s
Press any key to continue.
e risulta evidente che qualcosa non quadra, evidentemente perché il tempo che intercorre tra due chiamate del costruttore è inferiore a quello necessario per innescare una modifica nell'argomento della srand().