Mam aplikację, w której zaimplementowany jest algorytm RANSAC. Dla tych co nie wiedzą, jest to algorytm, który działa iteracyjnie i losowo - losowo oszacowuje szukane parametry i sprawdza dopasowanie zbioru danych do tych parametrów, i powtarza ten proces wielokrotnie, wybierając najlepsze oszacowanie. W tym konkretnym problemie algorytm losuje 3 indeksy punktów, na podstawie których oszacuje płaszczyznę. Do losowania korzystam z metody rand()
, która jednak nie jest zainicjalizowana poprzez srand()
(co jest równoważne z zainicjalizowaniem jej jako srand(1)
), bo zależy mi na deterministyczności tego algorytmu, czyli żeby za każdym uruchomieniem na danej maszynie, dostawać te same ciągi pseudo-losowych liczb, tak by wyniki zawsze były te same.
Problemem jest to, że gdzieś ten determinizm został złamany i za każdym razem wyniki nieco się różnią. Domyślam się, że jest to związane właśnie z wynikiem działania rand()
i być może kompilator dokonuje sobie jakichś optymalizacji, które powodują że losowanie może się różnić za każdym razem. Jednak, gdy próbuję wyświetlić te losowe wartości, by potwierdzić tę hipotezę, albo puścić program w trybie debug, to wtedy zachowuje się deterministycznie. a losowe wartości za każdym razem są takie same, tak jakbym tego oczekiwał. Przypomina to trochę pomiar kwantowy - dopóki nie dokonam obserwacji, to dana cząstka jest w superpozycji różnych stanów i dopiero odczyt spowoduje ustalenie wartości. Tutaj, dopóki nie wyświetlam wartości zmiennej, to zmienne mogą mieć różne wartości a przez to dawać różne wyniki. Nie chcę jednak wyświetlać tych wartości, bo są ich miliony. Próbowałem użyć modyfikatora volatile
:
volatile unsigned int r1 = rand();
volatile unsigned int r2 = rand();
volatile unsigned int r3 = rand();
nie wiem czy sensownie, ale to i tak nie pomaga. Czy ktoś może wyjaśnić co tu się dzieje, i jak przywrócić determinizm tego kodu?
Wiem oczywiście, że są nowsze generatory liczb typu mt19937, ale niekoniecznie zależy mi na lepszej "losowości", tylko na tym determinizmie.