iOS разработчик, который делится фишками, своим опытом и опытом других.
В этом канале вы сможете найти истории из жизни, подходы к реализации а также новости и тренды из мира iOS-разработки
Авторский канал, iOS разработка
Как работает Bool.random() в Swift на самом деле?
Наверняка, в своих проектах каждый хоть раз использовал нечто вроде:
let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomBool = Bool.random()
🤔 Но задумывались ли вы, что происходит на самом деле внутри? Иногда я смотрю на реализацию крутых вещей в ядре Swift, как например в посте про сортировку, и ищу материалы, объясняющие то или иное решение.
Так вот, в случае Bool полная реализация API будет получать необработанное значение UInt64 от генератора (он же RNG), сдвигать его вправо 17 раз и возвращать true, если первый бит результирующего значения равен 0.
Самое интересное в количестве, а именно, почему же 17?
Причина, по которой значение сдвигается ровно 17 раз, заключается в том, что (некоторые) слабые ГСЧ (генераторы случайных чисел) имеют лучшие свойства случайности в средних битах по сравнению с младшими/старшими битами.
Команда разработчиков Swift решила защитить нас от API, которые решили использовать эти ГСЧ вместо стандартного SystemRandomNumberGenerator.
ℹ️ Кстати, до пулл-реквеста, в котором реализовано это улучшение, Bool.random() просто возвращал generator.next() % 2 == 0.
📖 Почитать подробнее можно в ядре свифта или в более понятном источнике. А ещё рекомендую пост про UUID.
@iOS Dev