Re[4]: Java Interop - один и тот же код возвращает разные значения
От: Кодт Россия  
Дата: 17.03.25 10:58
Оценка:
Здравствуйте, m2user, Вы писали:

К>>Офигеть! А почему этот код зависит от фазы луны? Там внутри рандомизатор стоит?

К>>Если авторы стандартной библиотеки сделали так намеренно, — надо бить их сапогами. На ровном месте превратить шрёдинбаги в гейзенбаги.

M>А на мой взгляд это правильный подход. Нужен, чтобы программисты не вносили баги Шредингера (осознанно или случайно).


Шрёдинбаг лучше гейзенбага, потому что они оба плохо ловятся, но шрёдинбаг хотя бы воспроизводится.

К>>Например, в алгоритм сортировки добавлен рандомизатор "для улучшения времени работы в среднем".

К>>И до кучи, один и тот же набор данных обычно сортируется за логлинейное время, но в зависимости от фазы луны иногда убегает в квадратное.

M>Если это документированное поведение, то в чём проблема? Не устраивает — пиши свою сортировку.


А если недокументированное?
В доке на HashMap сказано, что он не даёт никаких гарантий на порядок.
Но не сказано, что он рандомизирует намеренно.

Например, в C++ std::sort нестабильный, но чистый.
std::unordered_map не даёт гарантий, но опять-таки чистый: два одинаково сформированных мапа (последовательность вызовов reserve и insert) одинаково итерируются.

К>>И ещё до кучи, это меняет состояние глобального рандомизатора, то есть, якобы чистый код перестаёт быть идемпотентным: программа в самых отдалённых уголках будет вести себя по-разному, в зависимости от того, отсортируешь ты один массив единожды или дважды.


M>Что такое глобальный рандомизатор в данном случае?


Math.random(), например.
Какой-то ГСЧ с глобальным состоянием.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.