c ++ запутанная формула для случайного числа между x и y - PullRequest
0 голосов
/ 01 апреля 2020

x + (rand() % y - x + 1) это формула для нахождения случайного числа между x и y, но я не знаю, как это было сделано. Мне нужно логическое / математическое объяснение этого и заранее спасибо.

1 Ответ

3 голосов
/ 01 апреля 2020

Во-первых, ваш код должен быть исправлен на x + (rand() % (y - x + 1))

Функция rand генерирует псевдослучайное положительное целое число между 0 и RAND_MAX, которое обычно реализуется алгоритмом PMMLCG Хатчинсона. Когда мы предполагаем, что RAND_MAX достаточно велико, возможности появления любого положительного целого числа одинаковы. И поэтому, когда вы примените результат к операции mod, скажем, %n, тогда у нас будет псевдослучайное целое число в интервале [0, n-1]

В вашем примере, (rand() % (y - x + 1)) генерирует псевдослучайное целое число между [0, y-x] и когда мы добавляем x к нему, мы получаем псевдослучайное значение между [x, y]

Однако, как дополнение, этот алгоритм имеет то, что я бы назвал серьезными проблемами, наиболее очевидным из которых является значение RAND_MAX. Стандарт только гарантирует, что это целое число не менее 32767, что является очень малым значением, и поэтому оно может способствовать неравномерности вероятности появления кандидатов в интервале.

Я предлагаю вам узнать использовать библиотеку <random> в C ++ 11: https://en.cppreference.com/w/cpp/header/random

...