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? |
|
NopeDotAvi |
» 2014-12-10 21:07:16 no mam pomysł. Podaj kod. |
|
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) |
|
akwes |
» 2014-12-10 21:21:11 |
|
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++. |
|
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. |
|
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(). srand( 0 ); rand(); rand(); rand(); rand(); rand(); rand();... srand( 1 ); rand(); rand(); rand(); rand(); rand(); rand();... srand( 2 ); rand(); rand(); rand(); rand(); rand(); rand();...
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 |
|
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. |
|
« 1 » 2 |