C # Случайный с плавающей точкой Закрытый интервал - PullRequest
0 голосов
/ 31 мая 2018

Я удивлен, что нигде не смог найти ответ на этот вопрос, поэтому, возможно, я что-то упускаю.

NextDouble метод System.Random класс возвращает значение double в диапазоне [0.0,1.0).Это полуоткрытый интервал, который возвращает 0.0 <= x < 1.0.

Мне нужен закрытый интервал [0.0,1.0] такой, что 0.0 <= x <= 1.0.В C ++ я мог бы использовать std::nextafter, который возвращает мне наименьшее представимое число с плавающей запятой, превышающее переданный параметр (например, std::nextafter(1.0, 2.0) вернул бы 1.0000001192092895508).Кажется, я не могу найти эквивалент в C #.

Я работаю с тоннами высокоточных чисел (16 бит), поэтому, хотя 1.0 может появляться редко, мне все еще нужно, чтобы он имел возможность.И хотя разница между 1.0 и 1.0000001192092895508 может показаться незначительной (и часто таковой), разница будет иметь значение в этом случае.

После реализации решения, аналогичного this версия NextAfter, иногда я получаю числа больше максимума (например, 5.00000027008353 для [0.0,5.0])

Random.NextDouble() * ((NextAfter(max, max + 1.0) - min) + min);

Как я могу генерировать случайные числа с плавающей запятой с закрытым интервалом?Я собираюсь выполнить это много раз, поэтому желательно что-то, что не займет слишком много времени для выполнения (например, многократный вызов Random или использование циклов while и выборки отклонения).Кроме того, необходимо быть беспристрастным, чтобы получить единообразные результаты (т. Е. Ни один номер не должен появляться с большей вероятностью, чем любой другой номер).

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Это кажется простым:

  • Решите, как часто вы хотите, чтобы 1.0 появлялся в среднем.Скажем, один на каждый миллиард раз.
  • Создайте случайное целое число от нуля до двух миллиардов из распределения в форме колокола со средним числом миллиарда по вашему выбору.Назовите это n.
  • Генерируйте n случайных чисел на открытом интервале.
  • Генерируйте 1,0.
  • Повтор.

Теперь у вас естьпоследовательность случайных чисел в замкнутом интервале, где 1,0 появляется в среднем ожидаемое количество раз.Вы получаете одно дорогое вычисление в форме колокола каждый миллиард или около того, которое амортизируется практически до нуля.

0 голосов
/ 31 мая 2018

Ваше битовое представление чисел с плавающей точкой подразумевает ограниченное количество различных значений.Определите количество возможных значений с плавающей запятой, получите случайное значение int в этом диапазоне и отобразите / преобразуйте это значение в свой диапазон с плавающей запятой.

...