Ошибка модуляции - это проблема, возникающая при наименее использовании операции modulo для получения псевдослучайных чисел, меньших заданной «верхней границы».Устранение погрешности по модулю: как это достигается в функции arc4random_uniform()?
Поэтому в качестве программиста С я использую модифицированную версию функции arc4random_uniform()
для генерации равномерно распределенных псевдослучайных чисел.
Проблема в том, что я не понимаю, как работает функция, математически.
Это пояснительный комментарий функция, за ними следуют ссылки на полный исходный код:
/*
* Calculate a uniformly distributed random number less than upper_bound
* avoiding "modulo bias".
*
* Uniformity is achieved by generating new random numbers until the one
* returned is outside the range [0, 2**32 % upper_bound). This
* guarantees the selected random number will be inside
* [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
* after reduction modulo upper_bound.
*/
Из комментария выше мы можем определить:
[2^32 % upper_bound, 2^32)
- интервал A[0, upper_bound)
- интервал B
Для того, чтобы работать, функция опирается на тот факт, что интервал отображения А к интервалу В.
Мой вопрос: математически, как же число в интервале карте равномерно на те, в интервале B? И есть ли доказательство этого?
Предлагаю прочитать следующее: http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – ouah
«Создание новых случайных чисел до тех пор, пока .. . «Плохая техника. У меня нет ответа, но лучше масштабировать случайное число до требуемого диапазона, чем отклонять и тратить время. Это любое использование? http://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator Вся идея случайных чисел чревата трудностями, легко путать «случайный» с «равномерно распределенным». –
«... лучше масштабировать случайное число до требуемого диапазона ...» Это на самом деле невозможно :-) Например, попробуйте выборочно отбирать целое число из набора {1, 2, 3, 4 , 5}, используя один бросок кости. – m7thon