Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Насколько неравномерно распределение случайных чисел при делении по модулю?

В соседнем вопросе зашла речь о неравномерности распределения чисел при использовании ГСЧ и деления по модулю. То же упоминается и в доках (rand):
Notice though that this modulo operation does not generate uniformly distributed random numbers in the span (since in most cases this operation makes lower numbers slightly more likely).
Возьмем пример ГСЧ от 0 до 1000 с шагом 25:
return 25 * (rand() % 41); // Неравномерное распределение
return int((40.0 * rand()) / (RAND_MAX + 1.0)) * 25; // Равномерное распределение
Так вот вопросы: - насколько неравномернее первый подход, чем второй? - насколько этот эффект проявляется в практических задачах? - стоит ли об этом беспокоиться? - если стоит, то начиная с какого момента? - какие есть варианты обхода неравномерности (кроме приведенного примера)?


Ответ

Для реализаций, где RAND_MAX равно 32767, это может быть заметно. Например если нам нужно получить число от 0 до 9999, при использовании
rand() % 10000
для значений до 2767 будет больше на 25% вероятности выпадения, т.к. они попадают в диапазоны rand:
0..2767, 10000..12767, 20000..22767, 30000..32767
в то время как для значений 2768..9999 диапазоны rand:
2768..9999, 12768..19999, 22768..29999
Если результат используется для выбора выигрышного билета в серии, то рекомендовал бы покупать билеты с младшими номерами.
Соответственно чем больше RAND_MAX и меньше делитель, тем равномернее распределение при подходе с модулем.

Комментариев нет:

Отправить комментарий