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