




Также есть метод .NextDouble(), который делает почти то, что вы хотите - только от 0 до 1.0 вместо -1.0 до 1.0.
Ооо. Это лучший ответ +1.
Спасибо, теперь я вспомнил об этом, но он по-прежнему поддерживает не от до, а от 0 до n, чего по-прежнему не хватает. Почему бы также не иметь перегрузки с a на b, верно?
Это не так уж и сложно - всего лишь два вызова: один для Random.Next () для целой части, а другой для NextDouble () для мантиссы.
Есть ли причина, по которой более канонический (NextDouble () * 2-1) не работает? Все ли части мантиссы значимы в вашем приложении?
Я больше думал о любом диапазоне, а не только от -1 до 1, поскольку в большом диапазоне один вызов не будет иметь такой же точности.
Да, я имел в виду от n до m, где n может быть отрицательным и т. д. Также это в Random (int), но не Random (double) заставляет меня задуматься.
(NextDouble () * (max - min) + min) будет работать, если "в основном случайный" достаточно случайный.
Подавляющее большинство случаев использования случайных чисел, которые я видел (на самом деле, все, что я когда-либо видел, хотя, очевидно, за 3 десятилетия программирования я мало что видел) генерирует случайные целые числа в указанном диапазоне.
Следовательно, Random.Next мне кажется очень удобным.
Значит, вы мало что видели. :) В CG очень часто встречаются случайные числа с плавающей запятой.
Энтони, это зависит от типа программирования, которым ты занимаешься. То, что кто-то программирует, например, базы данных, не означает, что он видел все, что нужно для программирования. Поэтому я упомянул CG.
Интересно, сколько всего в мире приложений в стиле баз данных по сравнению с количеством приложений компьютерной графики?
Поскольку в большинстве случаев мы хотим, чтобы int находился в диапазоне, нам были предоставлены методы для этого. Многие языки поддерживают только случайный метод, который возвращает значение типа double от 0,0 до 1,0. C# предоставляет эту функциональность в методе .NextDouble ().
Это достаточно приличный дизайн, поскольку он делает возможным простое (бросание кубика - myRandom.Next (1,7);) и все остальное. - myRandom.NextDouble () * 2.0 - 1.0;
Если вы работаете с числами с плавающей запятой, то более полезен генератор случайных чисел с плавающей запятой от -n до n.
Затем напишите метод расширения на одну строку и используйте его в свое удовольствие.
Бросать кубик, по-видимому, не так просто - это myRandom.Next (1, 7), поскольку верхний предел является исключительным :)
It's clumsy having to write this and bolt it on top using extension methods
Не совсем - методы расширения лаконичны, и я рад, что для таких вещей есть возможность.
Методы расширения хороши, но вы застряли, если бы метод был статическим методом как static или как свойство (static или instance).
Вы можете использовать метод Random.NextDouble (), который будет генерировать случайное значение от 0,0 до 1,0, как предлагает @ Joel_Coehorn
Я просто хочу добавить, что расширение диапазона до -1,0 и 1,0 - это простой расчет.
var r = new Random();
var randomValue = r.NextDouble() * 2.0 - 1.0
Или, чтобы обобщить это, расширить результат NextDouble() на любой диапазон (a, b), вы можете сделать это:
var randomValue = r.NextDouble() * (b - a) - a
Вы хотели сказать: «… диапазон до -1,0, а 1,0 - это ...»
Кстати, я должен отметить, что, наконец, алгоритм генерации случайных чисел во фреймворке - это не что-то неуклюжее (например, cstdlib's rand()), а на самом деле хорошая реализация (Park & Miller, IIRC).
Этот метод не так уж и сложно добавить, кажется, идеальное использование метода расширения.
public double NextSignedDouble(this Random r)
{
return (r.Next(0, 2) == 0) ? r.NextDouble() : (r.NextDouble() * -1);
}
public static double NextDouble(this Random rnd, double min, double max){
return rnd.NextDouble() * (max - min) + min;
}
Звоните с:
double x = rnd.NextDouble(-1, 1);
чтобы получить значение в диапазоне -1 <= x < 1
Спасибо, я пойду с этим.
Это не настоящий вопрос, потому что никто не может на него реалистично ответить. Почему бы вместо этого не попросить обходной путь или альтернативу?