Witam, napisałem aplikację wielowątkową do symulacji skrzyżowania opierającej się na zasadzie prawej ręki. Początkowe losowanie pozycji odbywa się w głównym wątku podczas tworzenia obiektów klasy. Później jednak, już w czasie trwania symulacji, gdy samochód dojedzie do pierwszego celu wywołuje metodę, która losuje nową pozycję startową i cel. Niestety wszystkie pojazdy wylosują sobie tę samą pozycję i cel :/
rand() nie powinieneś wywoływać współbieżnie. Wyjścia są dwa:
- synchronizujesz dostęp do rand() (niezalecane ze względu na wydajność)
- tworzysz dla każdego wątku osobny random generator z innym seedem (np czas + numer watku). To rozwiązanie wymaga generatora liczb pseudolosowych, którego można tworzyć wiele instancji (przykładowo boost ma takie generatory).
z boostem mam pewne problemy, pluje się o coś, gdy tylko dołączę plik nagłówkowy (Cannot convert 'is_void<T>::value' to 'bool')
Jakie są inne generatory, albo jak zsynchronizować dostęp do rand()?
Bawiłem się sekcją krytyczną, ale przy jej użyciu program się sypie :/
Używałem:
// gdzies w globalu
CRITICAL_SECTION g_Section;
//plus implementacja
InitializeCriticalSection( & g_Section );
//i ograniczenie sekcją randa
EnterCriticalSection( & g_Section );
losuj();
LeaveCriticalSection( & g_Section );
Boost jest Ci niepotrzebny: http://en.cppreference.com/w/cpp/numeric/random
I czego użyć, na pewno nie chcę żadnego z rozkładów, a rand tak jak pisałem nie działa tak jak chcę
to nawet nie o to chodzi, bo ja widzę co tam jest, ale jak chciałem użyć któregoś z generatorów to się okazało, że nie ma biblioteki do nich
Chev_Lucas napisał(a):
jak chciałem użyć któregoś z generatorów to się okazało, że nie ma biblioteki do nich
bo potrzebujesz kompilatora obsługującego nowy standard c++.
Z tego co widzę używasz Qt, więc czemu nie użyjesz qrand (jest thread safe)?
Poza tym, napisanie (przepisanie z internetu) generatora liczb losowych o podobnej jakości co rand to naprawdę żaden problem. To zaledwie tylko parę linijek, a będziesz miał pełną kontrole nad tym co się dzieje (wystarczy opakować w jakąś klasę).
Najprostszy to x = x * 16807 % 2147483647
(Minimal Standard minstd_rand0).