Я удивлен, что нигде не смог найти ответ на этот вопрос, поэтому, возможно, я что-то упускаю.
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 и выборки отклонения).Кроме того, необходимо быть беспристрастным, чтобы получить единообразные результаты (т. Е. Ни один номер не должен появляться с большей вероятностью, чем любой другой номер).