Temat: Dlaczego program losuje te same liczby?

Jeżeli wykorzystujemy w naszym programie funkcję rand(), należy również pamiętać o poprawnej inicjalizacji generatora liczb pseudolosowych przy pomocy funkcji srand().

W przeciwnym przypadku możemy napotkać dwa objawy niepoprawnego działania:

1. Program przy każdym uruchomieniu losuje ten sam zestaw liczb.

Taka sytuacja występuje, gdy funkcji srand() nie ma wcale, lub do funkcji srand() jest przekazywana zawsze ta sama wartość (np. 0). Dlatego do funkcji srand przekazujemy aktualną wartość licznika milisekund zwracaną przez funkcję time(), by zwiększyć szansę na to, że przy każdym uruchomieniu programu będzie to inna liczba.

2. Program w pętli losuje zawsze jedną i tą samą liczbę.

Taka sytuacja występuje z kolei, gdy funkcja srand() wywoływana jest wielokrotnie. Nawet jeżeli jest w niej użyta funkcja time(), to jeżeli tylko dzieje się to w jednej i tej samej milisekundzie (a z reguł komputer jest wystarczająco szybki aby tak się stało), generator liczb pseudolosowych jest za każdym razem inicjalizowany od nowa tą samą wartością. W takim przypadku należy zadbać o to, aby funkcja srand została wywołana rzadziej, wystarczy raz na początku programu.

Moim zdaniem nazwa funkcji srand niewiele mówi, dlatego proponuję w programie opakować ją w osobną funkcję i tę funkcję wywołać gdzieś na początku programu (wystarczy to zrobić raz).

void inicjalizuj_generator() {
   srand((unsigned)time(NULL));
}