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

[c++] Liczby losowe w większym programie

Ostatnio zmodyfikowano 2015-01-15 19:04
Autor Wiadomość
lectre
Temat założony przez niniejszego użytkownika
[c++] Liczby losowe w większym programie
» 2014-12-10 20:53:51
Witam. Jestem w trakcie tworzenia gry. W mniej więcej środkowym etapie spostrzegłem, iż program źle generuje liczby losowe. Program jest podzielony na kilka plików źródłowych + plik nagłówkowy. funkcję srand(time(NULL)) próbowałem wstawiać wszędzie, niestety z tym samym (złym) skutkiem. Myślę, że właśnie z tym jest problem, gdyż za każdym razem obiekty otrzymują niemal identyczne (zamiast losowych!) pozycje. Macie jakieś pomysły, koledzy?
P-122647
NopeDotAvi
» 2014-12-10 21:07:16
no mam pomysł. Podaj kod.
P-122648
lectre
Temat założony przez niniejszego użytkownika
» 2014-12-10 21:16:51
Kodu jest w sumie ponad tysiąc linijek. Może opiszę strukturę programu:

1) Funkcja main, która zawiera jedynie wywołanie funkcji menu oraz game.
2) Funkcja menu, która nas nie interesuje tutaj.
3) Funkcja game, która "zapożycza" z pliku zawierającego klasy, które są użyte w funkcji game.
4) Wszystko to, co jest transportowane między plikami jest w pliku .h (header file)
P-122649
akwes
» 2014-12-10 21:21:11
srand( time( NULL ) )
Wywołujesz raz. Raz na całą aplikację.

Albo w ogóle olej to i używaj: http://www.cplusplus.com​/reference/random/
P-122650
lectre
Temat założony przez niniejszego użytkownika
» 2014-12-10 21:34:10
Tak, wiem że raz na całą aplikację. Postaram się zaznajomić z tym, co wysłałeś.

Edit: Chciałbym się tylko upewnić. Na początku używałem losowych liczb jedynie w jednej klasie, więc tam też ustawiłem sranda. Po stworzeniu kolejnych klas, które używały licz losowych, przeniosłem sranda do funkcji game, gdzie te klasy są używane. Jest to poprawne, prawda? Poza tym, losowania odbywają się w metodach klas. Nie wiem, czy nie popełniłem jakiegoś trywialnego błędu. Jest to dopiero mój pierwszy większy projekt w obiektowym c++.
P-122652
pekfos
» 2014-12-11 22:39:34
Chciałbym się tylko upewnić. Na początku używałem losowych liczb jedynie w jednej klasie, więc tam też ustawiłem sranda. Po stworzeniu kolejnych klas, które używały licz losowych, przeniosłem sranda do funkcji game, gdzie te klasy są używane. Jest to poprawne, prawda? [..] Nie wiem, czy nie popełniłem jakiegoś trywialnego błędu.
Jeśli masz trywialny błąd, to w kodzie, a nie w samym pomyśle.
P-122722
GolemXIV
» 2014-12-12 18:07:46
W ogóle nie używaj srand(time(NULL). Najlepiej już nigdy :)

Jakiś tuman to wymyślił sto lat temu, i teraz w książkach pokutuje taki babol, i młodzież uczą.

Najfajniejszą cechą liczb (pseudo)losowych jest ich ... losowość, nieprzewidywalność. Jako losowość przyjmuje się (mniej więcej) entropię Shannona.

Dla standardowej funkcji rand() wynosi ona nie lepiej, niż 32. Dlatego, że srand() ma jako argument unsigned int, czyli jest 2^32 możliwych ciągów wartości kolejnych wywołań rand().

C/C++
srand( 0 ); rand(); rand(); rand(); rand(); rand(); rand();...// jeden ciąg
srand( 1 ); rand(); rand(); rand(); rand(); rand(); rand();...// inny ciąg
srand( 2 ); rand(); rand(); rand(); rand(); rand(); rand();...// inny ciąg

srand(time(NULL)) znakomicie psuje tę i tak niewiele wartą entropię. Sekund w roku jest raptem 2^25, a w ciągu doby nieco więcej niż 2^16. Może się zdarzyć, z wcale niemałym prawdopodobieństwem, że kolejne uruchomienia Twojego programu dadzą te same sekwencje rand() (jeśli odpaliłeś w tym samym czasie), i z nieprzewidywalności nici.

Zaufaj bibliotece - ona skądś bierze pierwsze srand(), i ten srand(_cos_tam_)) jest znacznie lepszy niż srand(time(NULL))

A jeśli byś chciał lepiej, to:

std::random_device (C++11)
rand_s (Windows API: RtlGenRandom)
/dev/random (*ix)
boost::random
biblioteki kryptograficzne mają niezłe generatory
http://random.org
P-122752
lectre
Temat założony przez niniejszego użytkownika
» 2014-12-14 23:56:27
Przepraszam za 2 dni nieobecności, mój projekt mnie pochłonął kompletnie. Dziękuję panie Golem, to bardzo ciekawe i niezwłocznie się do tego zastosuję. Btw ostatnio zmieniłem komputer na znacznie szybszy i... zauważyłem, że analogicznie do tego co mówisz, liczby bardzo często losują się podobne (ba! czasami nawet takie same). Dziękuję jeszcze raz i pozdrawiam serdecznie.
P-122883
« 1 » 2
  Strona 1 z 2 Następna strona