Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

rand() na Linuxie i FreeBSD

Ostatnio zmodyfikowano 2013-01-15 15:17
Autor Wiadomość
derw
Temat założony przez niniejszego użytkownika
rand() na Linuxie i FreeBSD
» 2013-01-15 08:46:11
Witam,

mam taki prosty kod, generujący 13 losowych liczb z zakresu 4-10 włącznie:

C/C++
#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.
P-73996
krzyk
» 2013-01-15 10:28:28
Jeśli chcesz mieć wiarygodne porównania na różnych systemach powinieneś do srand podawać stałą liczbę a nie time.
P-74002
xevuel
» 2013-01-15 10:32:32
rand() zwraca liczby pseudolosowe. Jeśli chcesz się dowiedzieć jak to wygląda od środka, poszukaj w googlach, lub oglądnij to: http://www.youtube.com/watch?v=u43y_WE52Ig
P-74003
derw
Temat założony przez niniejszego użytkownika
» 2013-01-15 10:48:47
@krzyk uruchomiłem ten sam kod na różnych systemach w celu sprawdzenia czy na każdym z nich występuje podobna sytuacja.
Linux i OpenBSD generują "losowe" liczby natomiast we FreeBSD każdy generowany ciąg rozpoczyna się (w moim przypadku) od 10.

@xevuel wrócę do domu to posłucham w pracy nie mam głośników ;)
Wiem że time() "sieje" losowość w generowanych liczb, ale dlaczego na Linuxie generowane liczby wyglądają na losowe a na FBSD pierwsze dwie są ewidentnie zależne od godziny i minuty.

Nie wiem, może idę w złym kierunku, może problem leży w czymś innym.

PS. Wyjście i wnioski są chyba takie, że aby mieć lepiej generowane losowe liczby, trzeba porzucić rand().
P-74004
xevuel
» 2013-01-15 11:04:03
Wszystko zależy od początkowego ziarna, w różnych kompilatorach mogą też występować/występowały? drobne różnice pomiędzy implementacjami. http://wiki.osdev.org/Random_Number_Generator - przeczytaj przynajmniej to :)
P-74006
derw
Temat założony przez niniejszego użytkownika
» 2013-01-15 11:19:54
@xevuel dzięki za pomoc, trochę mi to wszystko się rozjaśniło :)

C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
int main() {
    //srand(time(0));
    int a = 0;
    int s = 0;
    do {
        s =( arc4random() % 7 + 4 );
        std::cout << s << ",";
        a++;
    } while( a != 10 );
   
    return 0;
}

Generuje znacznie lepsze wyniki.
Wystarczyło zamienić rand() na arc4random()? :)
P-74007
xevuel
» 2013-01-15 11:49:16
Wystarczyło zamienić rand() na arc4random()? :)
Nie wiem jak wygląda arc4random() od środka, trudno powiedzieć :) Ale jeśli uważasz temat za rozwiązany, zamknij go :)
P-74013
derw
Temat założony przez niniejszego użytkownika
» 2013-01-15 11:52:46
Z tego co doczytałem to chyba ma "wbudowane" sianie a co więcej w środku to nie wiem, na razie mam dość tych generatorów :)
Masz racje, problem rozwiązany, może się komuś przyda.
P-74015
« 1 » 2
  Strona 1 z 2 Następna strona