Распространенный шаблон программирования выбирает случайные элементы с использованием модуля: `choices[random_u64() % n]`. Это кажется интуитивно понятным, но вводит статистическое смещение, потому что диапазон случайных чисел редко делится равномерно на количество вариантов.
Например, при выборе из 3 элементов с использованием случайного числа в диапазоне [0, 9] первому варианту достается 4 входных значения (0, 3, 6, 9), тогда как каждому из вариантов 2 и 3 — только по 3. Первый вариант выбирается в 40% случаев вместо ожидаемых 33,3%. Это смещение по модулю возникает всякий раз, когда диапазон случайных чисел не является кратным количеству вариантов.
Правильный подход использует функцию `random_between(l, h)`, которая корректно распределяет вероятность, хотя её реализация сложнее. Лучший дизайн API предоставил бы функции более высокого уровня, например `random_choice()`, принимающие явные распределения вероятностей, заставляя разработчиков непосредственно сталкиваться с требованиями к распределению, а не полагаться на ошибочные низкоуровневые примитивы.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing