2011-08-05 9 views
10

Mam aplikację C++, która wywołuje rand() w różnych miejscach. Czy muszę regularnie inicjować srand(), aby upewnić się, że rand() jest w zasadzie losowy, czy wystarczy wywołać go raz, gdy aplikacja się uruchomi?Jak często powinienem wywoływać srand() w aplikacji C++?

+2

'srand' nie robi' rand' "więcej" random. W żaden sposób nie zapewnia "rozsądnej przypadkowości". Po prostu powoduje, że sekwencja liczb losowych zaczyna się od określonego punktu. – jalf

Odpowiedz

15

Jeśli masz tylko jeden wątek, materiału siewnego raz. Jeśli często wybierzesz ponownie, możesz przerwać niektóre statystyczne właściwości liczb losowych. Jeśli masz wiele wątków, nie używaj rand w ogóle, ale raczej coś podobnego, drand48_r threadsafe który pozwala utrzymać stan per-thread (więc można materiału siewnego raz w wątku).

+1

+1 za wzmiankę o wątkach. – juanchopanza

+1

boost :: random jest bardziej mobilny niż drand48_r lub użyj 0x C++ random (która jest pochodną Boost) – MSalters

+2

@MSalters: Oczywiście, że pójdę do nowego '' dysponuje każdy dzień. Są trochę bardziej zaangażowani w konfigurację, więc pomyślałem, że odpowiadam w duchu pytania - ale w rzeczy samej, użyj "", jeśli możesz! –

4

Tylko raz, na początku zgłoszenia.

4

No właśnie dzwoni raz jest w porządku. Użyj wartości początkowej, aby losowa kolejność była taka sama dla każdego wykonania. Może to być przydatne przy ustalaniu (na przykład) deterministycznego zachowania gry podczas odtwarzania jej w celu debugowania.

Powiązane problemy