korzystanie z rand() w wielu wątkach

0

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 :/

0

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).
0

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 );
0

Boost jest Ci niepotrzebny: http://en.cppreference.com/w/cpp/numeric/random

0

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ę

0

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

0
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++.

1

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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1