it-swarm.com.ru

Случайное число между 2 двойными числами

Можно ли сгенерировать случайное число между 2 двойными?

Пример:

public double GetRandomeNumber(double minimum, double maximum)
{
    return Random.NextDouble(minimum, maximum) 
}

Тогда я называю это следующим:

double result = GetRandomNumber(1.23, 5.34);

Любые мысли будут оценены.

130
CodeLikeBeaker

Да.

Random.NextDouble возвращает двойное значение от 0 до 1. Затем вы умножаете это значение на диапазон, в который нужно перейти (разница между максимумом и минимумом), а затем добавляете это к базе (минимум).

public double GetRandomNumber(double minimum, double maximum)
{ 
    Random random = new Random();
    return random.NextDouble() * (maximum - minimum) + minimum;
}

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

290
Michael

Johnny5 предложил создать метод расширения. Вот более полный пример кода, показывающий, как вы можете сделать это:

public static class RandomExtensions
{
    public static double NextDouble(
        this Random random,
        double minValue,
        double maxValue)
    {
        return random.NextDouble() * (maxValue - minValue) + minValue;
    }
}

Теперь вы можете вызвать его так, как если бы это был метод класса Random:

Random random = new Random();
double value = random.NextDouble(1.23, 5.34);

Обратите внимание, что вы не должны создавать много новых объектов Random в цикле, потому что это может привести к тому, что вы получите одно и то же значение много раз подряд. Если вам нужно много случайных чисел, создайте один экземпляр Random и используйте его повторно.

37
Mark Byers

Самый простой подход будет просто генерировать случайное число между 0 и разностью двух чисел. Затем добавьте меньшее из двух чисел к результату.

7
Greg D

Осторожно: если вы генерируете random внутри цикла, как, например, for(int i = 0; i < 10; i++), не помещайте объявление new Random() внутри цикла.

От MSDN :

Генерация случайного числа начинается с начального значения. Если одно и то же начальное число используется повторно, генерируется одна и та же серия чисел. Один из способов получения разных последовательностей - сделать начальное значение зависимым от времени, создавая тем самым разные серии с каждым новым экземпляром Random. По умолчанию конструктор без параметров класса Random использует системные часы для генерации своего начального значения ...

Исходя из этого, сделайте что-то как:

var random = new Random();

for(int d = 0; d < 7; d++)
{
    // Actual BOE
    boes.Add(new LogBOEViewModel()
    {
        LogDate = criteriaDate,
        BOEActual = GetRandomDouble(random, 100, 1000),
        BOEForecast = GetRandomDouble(random, 100, 1000)
    });
}

double GetRandomDouble(Random random, double min, double max)
{
     return min + (random.NextDouble() * (max - min));
}

Таким образом, у вас есть гарантия, что вы получите разные двойные значения.

6
Leniel Maccaferri

Вы можете использовать такой код:

public double getRandomNumber(double minimum, double maximum) {
    return minimum + randomizer.nextDouble() * (maximum - minimum);
}
3
Malcolm

Вы могли бы сделать это:

public class RandomNumbers : Random
{
    public RandomNumbers(int seed) : base(seed) { }

    public double NextDouble(double minimum, double maximum)
    {
        return base.NextDouble() * (maximum - minimum) + minimum;
    }
}
2
user490775

Что если одно из значений является отрицательным? Не было бы лучшей идеей быть:

double NextDouble(double min, double max)
{
       if (min >= max)
            throw new ArgumentOutOfRangeException();    
       return random.NextDouble() * (Math.Abs(max-min)) + min;
}
1
Chris Susie

Если вам нужно случайное число в диапазоне [double.MinValue; double.MaxValue]

// Because of:
double.MaxValue - double.MinValue == double.PositiveInfinity

// This will be equals to NaN or PositiveInfinity
random.NextDouble() * (double.MaxValue - double.MinValue)

Используйте вместо:

public static class RandomExtensions
{
    public static double NextDoubleInMinMaxRange(this Random random)
    {
        var bytes = new byte[sizeof(double)];
        var value = default(double);
        while (true)
        {
            random.NextBytes(bytes);
            value = BitConverter.ToDouble(bytes, 0);
            if (!double.IsNaN(value) && !double.IsInfinity(value))
                return value;
        }
    }
}
1
alex

Для генерации того же случайного числа, если вы вызываете его в цикле, отличное решение состоит в том, чтобы объявить новый объект Random () вне цикла как глобальную переменную.

Обратите внимание, что вы должны объявить свой экземпляр класса Random вне функции GetRandomInt, если собираетесь запускать это в цикле.

"Почему это?" - спросите вы.

Что ж, класс Random на самом деле генерирует псевдослучайные числа, причем "затравкой" для рандомизатора является системное время. Если ваш цикл достаточно быстрый, время системных часов не будет отличаться от рандомизатора, и каждый новый экземпляр класса Random будет начинаться с одного и того же начального числа и давать вам одно и то же псевдослучайное число.

Источник находится здесь: http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/

0
Ajibola