Здравствуйте, m2user, Вы писали:
К>>Офигеть! А почему этот код зависит от фазы луны? Там внутри рандомизатор стоит? К>>Если авторы стандартной библиотеки сделали так намеренно, — надо бить их сапогами. На ровном месте превратить шрёдинбаги в гейзенбаги.
M>А на мой взгляд это правильный подход. Нужен, чтобы программисты не вносили баги Шредингера (осознанно или случайно).
Шрёдинбаг лучше гейзенбага, потому что они оба плохо ловятся, но шрёдинбаг хотя бы воспроизводится.
К>>Например, в алгоритм сортировки добавлен рандомизатор "для улучшения времени работы в среднем". К>>И до кучи, один и тот же набор данных обычно сортируется за логлинейное время, но в зависимости от фазы луны иногда убегает в квадратное.
M>Если это документированное поведение, то в чём проблема? Не устраивает — пиши свою сортировку.
А если недокументированное?
В доке на HashMap сказано, что он не даёт никаких гарантий на порядок.
Но не сказано, что он рандомизирует намеренно.
Например, в C++ std::sort нестабильный, но чистый.
std::unordered_map не даёт гарантий, но опять-таки чистый: два одинаково сформированных мапа (последовательность вызовов reserve и insert) одинаково итерируются.
К>>И ещё до кучи, это меняет состояние глобального рандомизатора, то есть, якобы чистый код перестаёт быть идемпотентным: программа в самых отдалённых уголках будет вести себя по-разному, в зависимости от того, отсортируешь ты один массив единожды или дважды.
M>Что такое глобальный рандомизатор в данном случае?
Math.random(), например.
Какой-то ГСЧ с глобальным состоянием.