Вопрос

Я хотел бы сгенерировать случайное число с плавающей запятой между 2 значениями.Каков наилучший способ сделать это на C #?

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

Решение

Единственное, что я бы добавил к Эрикответ - это объяснение;Я чувствую, что знание того, почему код работает, лучше, чем знание того, какой код работает.

Объяснение этому таково:допустим, вам нужно число от 2.5 до 4.5.Диапазон составляет 2,0 (4,5 - 2,5). NextDouble возвращает только число от 0 до 1.0, но если вы умножите это значение на диапазон, то получите число от 0 до диапазон.

Таким образом, это дало бы нам случайные удвоения между 0.0 и 2.0:

rng.NextDouble() * 2.0

Но мы хотим, чтобы они были между 2,5 и 4,5!Как нам это сделать?Добавьте наименьшее число, 2,5:

2.5 + rng.NextDouble() * 2.0

Теперь мы получаем число от 0.0 до 2.0;если вы добавите 2,5 к каждому из этих значений, мы увидим, что диапазон теперь находится между 2,5 и 4,5.

Сначала я подумал, что имеет значение, будет ли b > a или a > b, но если вы разберетесь с обоими способами, то обнаружите, что это работает одинаково, если вы не перепутаете порядок используемых переменных.Мне нравится выражать это с помощью более длинных имен переменных, чтобы не запутаться:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

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

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

Для парных номеров вы можете заменить Next на nextDouble

Вот фрагмент того, как получить криографически безопасные случайные числа:Это заполнит 8 байт криптографически достоверной последовательностью случайных значений.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

Для получения более подробной информации смотрите Насколько случайным является ваш Рэндом??" (вдохновлено статьей Coding horror о перетасовке колоды)

Насколько случайно?Если вы можете иметь дело с псевдослучайностью, то просто:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

Если вы хотите получить "лучшее" случайное число, то вам, вероятно, следует взглянуть на алгоритм Mersenne Twister.У многих людей есть уже реализовал это хотя для тебя

Для объяснения того, почему Longhorn был так сильно модернизирован: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Поищите реализацию nextDouble и объяснение того, что такое случайный double.

Эта ссылка также является наглядным примером того, как использовать криптографические случайные числа (как упоминал Самир) только с реальными полезными выводами вместо битового потока.

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