Подтвердить что ты не робот

Как вы производите случайное число в С#?

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

4b9b3361

Ответ 1

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

Объяснение следующее: пусть вам нужно число от 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 или > b, но если вы будете работать в обоих направлениях, вы обнаружите, что это работает одинаково, пока вы не испортите порядок используемых переменных, Мне нравится выражать его с более длинными именами переменных, поэтому я не путаюсь:
double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

Ответ 2

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

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}

Ответ 3

// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

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

Ответ 4

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

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

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

Ответ 5

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

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

Подробнее см. Как случайный случайный? (вдохновленный статьей CodingHorror на перетасовке колоды)

Ответ 6

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

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