Да.
Random.NextDouble возвращает двойное значение от 0 до 1. Затем вы умножаете это значение на диапазон, в который нужно перейти (разница между максимумом и минимумом), а затем добавляете это к базе (минимум).
public double GetRandomNumber(double minimum, double maximum)
{
Random random = new Random();
return random.NextDouble() * (maximum - minimum) + minimum;
}
Реальный код должен иметь случайный статический член. Это сэкономит затраты на создание генератора случайных чисел и позволит вам очень часто вызывать GetRandomNumber. Поскольку мы инициализируем новый RNG при каждом вызове, если вы звоните достаточно быстро, чтобы системное время между вызовами не менялось, RNG будет засеян с одинаковой временной меткой и сгенерирует тот же поток случайных чисел.
public double GetRandomNumber(this Random random, double minimum, double maximum) {...}
Johnny5 предложил создать метод расширения. Вот более полный пример кода, показывающий, как вы можете сделать это:
Теперь вы можете вызвать его так, как если бы это был метод
Random
класса:Обратите внимание, что вы не должны создавать много новых
Random
объектов в цикле, потому что это может привести к тому, что вы получите одно и то же значение много раз подряд. Если вам нужно много случайных чисел, создайте один экземплярRandom
и используйте его повторно.источник
Будьте осторожны: если вы генерируете
random
внутренний цикл, как, напримерfor(int i = 0; i < 10; i++)
, не помещайтеnew Random()
объявление внутри цикла.Из MSDN :
Исходя из этого, сделайте что-то как:
Таким образом, у вас есть гарантия, что вы получите разные двойные значения.
источник
Самый простой подход будет просто генерировать случайное число между 0 и разностью двух чисел. Затем добавьте меньшее из двух чисел к результату.
источник
Вы можете использовать такой код:
источник
Вы могли бы сделать это:
источник
Я немного опоздал на вечеринку, но мне нужно было реализовать общее решение, и оказалось, что ни одно из решений не может удовлетворить мои потребности.
Принятое решение хорошо для небольших диапазонов; однако,
maximum - minimum
может быть бесконечность для больших диапазонов. Таким образом, исправленная версия может быть этой версией:Это генерирует случайные числа хорошо даже между
double.MinValue
иdouble.MaxValue
. Но это создает еще одну «проблему», которая хорошо представлена в этом посте : если мы используем такие большие диапазоны, значения могут показаться слишком «неестественными». Например, после генерации 10000 случайных двойныхdouble.MaxValue
значений между 0 и все значения были между 2,9579E + 304 и 1,7976E + 308.Поэтому я создал еще одну версию, которая генерирует числа в логарифмическом масштабе:
Некоторые тесты:
Вот отсортированные результаты генерации 10000 случайных двойных чисел между 0 и
Double.MaxValue
обеими стратегиями. Результаты отображаются с использованием логарифмической шкалы:Хотя линейные случайные значения на первый взгляд кажутся неправильными, статистика показывает, что ни одно из них не «лучше», чем другое: даже линейная стратегия имеет равномерное распределение, и средняя разница между значениями практически одинакова для обеих стратегий. ,
Игра с разными диапазонами показала мне, что линейная стратегия становится «вменяемой» с диапазоном от 0 до
ushort.MaxValue
«разумного» минимального значения 10,78294704 (дляulong
диапазона минимальное значение было 3,03518E + 15int
;: 353341). Это одинаковые результаты обеих стратегий, отображаемые в разных масштабах:Редактировать:
Недавно я сделал мои библиотеки с открытым исходным кодом, не стесняйтесь увидеть
RandomExtensions.NextDouble
метод с полной проверкой.источник
Что если одно из значений отрицательно? Не было бы лучшей идеей быть:
источник
Math.Abs()
это избыточно. Так как вы гарантировали этоmin >= max
, тоmax - min
все равно должно быть неотрицательным числом.Если вам нужно случайное число в диапазоне [
double.MinValue
;double.MaxValue
]Используйте вместо:
источник
Для генерации того же случайного числа, если вы вызываете его в цикле, отличное решение - объявить новый объект Random () вне цикла как глобальную переменную.
Обратите внимание, что вы должны объявить свой экземпляр класса Random вне функции GetRandomInt, если собираетесь запускать это в цикле.
"Почему это?" ты спрашиваешь.
Что ж, класс Random на самом деле генерирует псевдослучайные числа, причем «семя» для рандомизатора - это системное время. Если ваш цикл достаточно быстрый, время системных часов не будет отличаться от рандомизатора, и каждый новый экземпляр класса Random будет начинаться с одного и того же начального числа и давать вам одно и то же псевдослучайное число.
Источник находится здесь: http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/
источник
Используйте статический случайный случай или числа будут повторяться в тесных / быстрых циклах из-за того, что системные часы их заполняют.
Смотрите также: https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8
источник
источник