Почему метод Random.Next в .NET не поддерживает float / double?

Так что, может быть, я хочу иметь значения от -1.0 до 1.0 в виде чисел с плавающей точкой. Неуклюже писать это и прикреплять сверху, используя методы расширения IMO.

Это не настоящий вопрос, потому что никто не может на него реалистично ответить. Почему бы вместо этого не попросить обходной путь или альтернативу?

GEOCHET 09.01.2009 20:21

Также ответы ОП на ответы подтверждают, что это, по крайней мере, «субъективно и аргументировано».

GEOCHET 09.01.2009 20:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
3 539
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Также есть метод .NextDouble(), который делает почти то, что вы хотите - только от 0 до 1.0 вместо -1.0 до 1.0.

Ооо. Это лучший ответ +1.

AnthonyWJones 09.01.2009 20:20

Спасибо, теперь я вспомнил об этом, но он по-прежнему поддерживает не от до, а от 0 до n, чего по-прежнему не хватает. Почему бы также не иметь перегрузки с a на b, верно?

Joan Venge 09.01.2009 20:22

Это не так уж и сложно - всего лишь два вызова: один для Random.Next () для целой части, а другой для NextDouble () для мантиссы.

Joel Coehoorn 09.01.2009 20:24

Есть ли причина, по которой более канонический (NextDouble () * 2-1) не работает? Все ли части мантиссы значимы в вашем приложении?

Greg D 09.01.2009 20:32

Я больше думал о любом диапазоне, а не только от -1 до 1, поскольку в большом диапазоне один вызов не будет иметь такой же точности.

Joel Coehoorn 09.01.2009 20:38

Да, я имел в виду от n до m, где n может быть отрицательным и т. д. Также это в Random (int), но не Random (double) заставляет меня задуматься.

Joan Venge 09.01.2009 20:46

(NextDouble () * (max - min) + min) будет работать, если "в основном случайный" достаточно случайный.

Greg D 09.01.2009 21:10

Подавляющее большинство случаев использования случайных чисел, которые я видел (на самом деле, все, что я когда-либо видел, хотя, очевидно, за 3 десятилетия программирования я мало что видел) генерирует случайные целые числа в указанном диапазоне.

Следовательно, Random.Next мне кажется очень удобным.

Значит, вы мало что видели. :) В CG очень часто встречаются случайные числа с плавающей запятой.

Joan Venge 09.01.2009 20:48

Энтони, это зависит от типа программирования, которым ты занимаешься. То, что кто-то программирует, например, базы данных, не означает, что он видел все, что нужно для программирования. Поэтому я упомянул CG.

Joan Venge 09.01.2009 20:56

Интересно, сколько всего в мире приложений в стиле баз данных по сравнению с количеством приложений компьютерной графики?

AnthonyWJones 10.01.2009 18:02

Поскольку в большинстве случаев мы хотим, чтобы int находился в диапазоне, нам были предоставлены методы для этого. Многие языки поддерживают только случайный метод, который возвращает значение типа double от 0,0 до 1,0. C# предоставляет эту функциональность в методе .NextDouble ().

Это достаточно приличный дизайн, поскольку он делает возможным простое (бросание кубика - myRandom.Next (1,7);) и все остальное. - myRandom.NextDouble () * 2.0 - 1.0;

Если вы работаете с числами с плавающей запятой, то более полезен генератор случайных чисел с плавающей запятой от -n до n.

Joan Venge 09.01.2009 20:26

Затем напишите метод расширения на одну строку и используйте его в свое удовольствие.

xyz 09.01.2009 20:28

Бросать кубик, по-видимому, не так просто - это myRandom.Next (1, 7), поскольку верхний предел является исключительным :)

Jon Skeet 09.01.2009 20:33

It's clumsy having to write this and bolt it on top using extension methods

Не совсем - методы расширения лаконичны, и я рад, что для таких вещей есть возможность.

Методы расширения хороши, но вы застряли, если бы метод был статическим методом как static или как свойство (static или instance).

Joan Venge 09.01.2009 20:52

Вы можете использовать метод 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 - это ...»

Germstorm 09.01.2009 20:39

Кстати, я должен отметить, что, наконец, алгоритм генерации случайных чисел во фреймворке - это не что-то неуклюжее (например, 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

Спасибо, я пойду с этим.

Joan Venge 09.01.2009 21:38

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