Какой диапазон может вернуть случайная функция? - PullRequest
0 голосов
/ 25 октября 2019
int nextInt(int n) {
    return rand() / static_cast<double>(RAND_MAX) * n;
}

Я обнаружил, что кто-то написал вышеупомянутую функцию (nextInt), и он сказал, что nextInt возвращает случайное целое число в [0, n - 1], но я думаю, nextInt возвращает случайное целое число в [0, п]. Интересно, кто прав и почему?

Ответы [ 3 ]

3 голосов
/ 25 октября 2019

Какой диапазон может вернуть случайная функция?

Стандарт задает значение [0, RAND_MAX] (включительно).

IИнтересно, кто прав и почему?

Вы. nextInt технически может вернуть n, но у него очень мало шансов сделать это. Это происходит только тогда, когда rand () возвращает RAND_MAX (возможно, некоторые другие близкие значения в теоретическом случае, когда диапазон int не может быть точно представлен double, согласно комментариям).

1 голос
/ 25 октября 2019

Вы правы.

rand() возвращает значение в [0, RAND_MAX], поэтому функция возвращает значение в [0, n].

nextInt вернет случайное число, но ононе использует лапласианский дистрибутив для их генерации;потому что n встречается реже, чем другие числа из [0, n]

Вопрос о том, является ли это проблемой, зависит от варианта использования.

0 голосов
/ 25 октября 2019

Как упомянуто в ссылке , что: Возвращает псевдослучайное целое значение между 0 и RAND_MAX ( 0 и RAND_MAX включены ). Поэтому nextInt возвращает случайное значение типа int в [0, n].

Причина: когда rand() возвращает значение, равное RAND_MAX, тогда: RAND_MAX / RAND_MAX * n = n

...