Равномерно распределенные случайные числа, относительно простые до 2

StackOverflow https://stackoverflow.com/questions/1061036

Вопрос

Конкретный пример

Мне нужно сгенерировать случайное число от 0 до 2 включительно.(или выберите случайным образом между -1, 0 и 1).

Наивный подход состоял бы в том, чтобы сделать что-то вроде rand() mod 3 где rand() возвращает целое число.Этот подход не будет генерировать статистически случайные числа, если только верхняя граница rand() не является относительно простым (а нижняя граница равна 0).

Например, предполагая, что rand() возвращает 2 бита (от 0 до 3 включительно), модуль будет отображать:

0 -> 0
1 -> 1
2 -> 2
3 -> 0

Этот перекос в сторону 0, очевидно, был бы намного меньше, если бы было возвращено больше битов, но, несмотря на это, перекос остался бы.

Общий вопрос

Есть ли способ сгенерировать равномерно распределенное случайное число от 0 до n-1 включительно, где n является относительно простым числом, равным 2?

Это было полезно?

Решение

Обычный подход заключается в отбрасывании случайных значений выше последнего полного цикла и просто запросе нового случайного числа.

Другие советы

Это могло бы помочь выбрать верхнюю границу rand () равной k * n, где k - целое число.Таким образом, результат будет равномерно распределен при условии, что rand() является хорошим генератором случайных чисел.

Если невозможно уменьшить верхнюю границу, вы можете выбрать k так, чтобы k * n было как можно ближе к верхней границе rand() и отбросить результаты выше этого числа, попытавшись еще раз.

Видишь мой ответ на аналогичный вопрос.

В принципе, используйте свой ГСЧ и отбросьте все, что указано выше N, и повторите попытку.Для оптимизации вы можете использовать mod и отбросить все, что выше n * floor(макс. / n)

Общий ответ:Вам нужно использовать больше, чем просто 2 бита числа.

Мое эмпирическое правило заключается в генерации значений с плавающей запятой, x, 0.0 <= x < 1.0, умножьте на 3 и усечьте.Это должно дать вам значения в диапазоне 0, 1 и 2, которые зависят от большего количества битов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top