Как вы генерируете случайное число в C #? - PullRequest
33 голосов
/ 04 сентября 2008

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

Ответы [ 6 ]

60 голосов
/ 04 сентября 2008

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

Объяснение таково: допустим, вы хотите число от 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));
}
20 голосов
/ 04 сентября 2008
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
2 голосов
/ 04 сентября 2008
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

Для двойников вы можете заменить Next на NextDouble

1 голос
/ 04 сентября 2008

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

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

1 голос
/ 04 сентября 2008

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

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

Для получения более подробной информации см. Как случайно ваш случайный ?? "

1 голос
/ 04 сентября 2008

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

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

Если вам нужно «лучшее» случайное число, то вам, вероятно, стоит взглянуть на алгоритм Мерсенна Твистера. Множество людей уже уже реализовали это для вас, хотя

...