Witam,
mam taki prosty kod, generujący 13 losowych liczb z zakresu 4-10 włącznie:
#include <iostream>
#include <ctime>
#include <cstdlib>
int main() {
int a = 0;
int s = 0;
srand( time( NULL ) );
do {
s =( rand() % 7 + 4 );
std::cout << s << ",";
a++;
} while( a != 13 );
return 0;
}
Kod jest kompilowany na Linuxie i FreeBSD w ten sposób: g++ -o kod kod.c
I teraz zwracane rezultaty na obydwu maszynach:
Linux-dedyk (10 kolejnych uruchomień, każde w odstępie około 2-3sek.)
4,5,10,10,6,5,4,4,10,10,5,6,8
5,8,6,4,9,7,8,4,4,10,10,9,9
4,7,10,8,9,10,8,5,5,6,7,9,4
4,5,4,5,6,8,4,4,4,6,5,8,10
9,5,10,5,4,8,7,5,8,7,6,6,8
6,4,10,5,6,5,9,4,7,5,4,7,5
6,7,7,8,7,6,10,10,5,6,5,5,5
6,5,6,4,7,6,5,10,8,5,10,4,7
5,10,9,10,8,8,8,10,5,7,5,8,5
6,10,6,6,6,8,4,5,8,5,9,5,6
A teraz wyniki z FreeBSD na VMWARE i drugi na VBOX)
10,6,5,11,6,8,9,8,5,7,5,8,11
10,5,6,10,11,6,11,8,6,8,10,9,10
10,5,9,7,8,11,8,9,6,8,8,5,8
10,5,10,5,7,10,10,9,7,8,6,7,8
10,5,11,11,5,9,5,9,7,8,5,8,7
10,5,7,8,9,6,9,10,8,8,9,11,5
10,11,9,5,6,11,6,10,8,8,6,7,10
10,11,10,10,11,9,8,11,9,8,5,9,10
10,11,6,7,8,7,5,11,9,8,9,5,8
10,11,7,6,7,6,7,5,10,8,8,6,7
Jak widać w przypadku FreeBSD 1 liczba zawsze ta sama,na Linuxie jest w miarę losowo, zauważyłem że jest ona chyba... zależna od czasu, na BSD kompilowany był po godz. 9.00, wcześniej miałem same 9 (kompilowany po 8.00).
Nie wiem, to tylko moje domniemania, jestem początkujący w C++.
Dodam jeszcze to że, FreeBSD jest na VMWARE, sprawdzałem też na VBOXIE i ten sam "błąd" a dla ciekawostki, na OpenBSD zainstalowanym na dedyku nie ma tego problemu i pierwsze liczby generowane są losowo.
Linux to także dedyk, nie żadna wirtualka.
Problem z rand() na wirtualkach?
P.S. Właśnie sprawdziłem kod na FreeBSD dedyk i ten sam problem, 8 na początku, a godzina była ustawiona 8:33. Więc problem raczej tkwi po stronie FreeBSB.
Linux na VMWARE - nie ma problemu, generują się losowo.