Корректный метод Случайных “помех”. Затем в C#?

В дополнение к AKF, существует Transactional Auto Scaler (TAS), языковая карта шаблонов масштабируемости (SPLM) и человек, достигший повсеместного производства (PAUM) ... Этот pdf описывает модели оценки (Количественный / Качественный) масштабируемости, в различных областях, таких как: производственные системы, компьютерные науки, организационные и бизнес.

Edit1

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

Масштабируемость может быть измерена в различных измерениях, таких как:

Административная масштабируемость: способность растущего числа организаций или пользователей легко совместно использовать одну распределенную систему. Функциональная масштабируемость: способность улучшать систему за счет добавления новых функций при минимальных усилиях.

Географическая масштабируемость: способность поддерживать производительность, полезность или удобство использования независимо от расширения от концентрации в локальной области до более распределенной географической структуры.

Масштабируемость нагрузки и т. Д.

AKF выглядит как модель, а не как подход к измерению масштабируемости, из определения:

«Куб Scale помогает командам сохранять критические измерения масштаба системы in mind при разработке решений и при создании существующих систем. are being improved. "

27
задан Sunil 25 April 2012 в 18:09
поделиться

10 ответов

Лучше всего создать один экземпляр Random и использовать его во всей программе, иначе результаты могут быть не такими случайными. Такое поведение поощряется тем, что не создается статическая функция.

Вам не следует беспокоиться о «создании экземпляра без надобности», влияние в лучшем случае незначительно - так работает фреймворк.

34
ответ дан 28 November 2019 в 04:15
поделиться
//Function to get random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
    lock(syncLock) { // synchronize
        return random.Next(min, max);
    }
}

Скопировано непосредственно из

27
ответ дан Community 28 November 2019 в 04:15
поделиться

Вы уже получили ответы здесь. Просто повторяя правильное решение :

namespace mySpace
{
    public static class Util
    {
        private static Random rnd = new Random();
        public static int GetRandom()
        {
            return rnd.Next();
        }
    }
}

Таким образом, вы можете назвать:

var i = Util.GetRandom();

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

public static class Util
{
    public static int GetRandom()
    {
        return Guid.NewGuid().GetHashCode();
    }
}

Это будет немного медленнее, но может быть гораздо более случайным, чем Random.Next, по крайней мере из моего опыта.

Но не :

new Random(Guid.NewGuid().GetHashCode()).Next();

Создание ненужного объекта замедлит работу, особенно в цикле.

И никогда :

new Random().Next();

Мало того, что оно медленнее (внутри цикла), это случайность ... ну, на мой взгляд, не очень хорошо ...

5
ответ дан cygnim 28 November 2019 в 04:15
поделиться

Почему бы и нет?

Вам необходимо создать экземпляр, поскольку способ генерирования случайных чисел заключается в том, что предыдущие ответы влияют на последующие ответы. По умолчанию конструктор new Random() использует текущее системное время для «заполнения» последовательности, но это не обязательно: вы можете передать свой собственный номер, если хотите. В частности:

var rand = new Random(1234);
Console.WriteLine(rand.Next(0, 100));
Console.WriteLine(rand.Next(0, 100));
Console.WriteLine(rand.Next(0, 100));
Console.WriteLine(rand.Next(0, 100));

будет каждый раз производить одну и ту же последовательность «случайного» числа.

Это означает, что классу Random необходимо хранить данные экземпляра (предыдущий ответ или «начальное число») для последующих вызовов.

3
ответ дан Dean Harding 28 November 2019 в 04:15
поделиться

Создание нового экземпляра Random с последующим вызовом его несколько раз, например :

for (int i = 0; i < 1000; i++)
{
     Random rand = new Random();
     Console.WriteLine(rand.Next(1,100));
}    

. Даст вам распределение, взвешенное в направлении нижней границы диапазона.

Делаем так:

Random rand = new Random();
for (int i = 0; i < 1000; i++)
{
     Console.WriteLine(rand.Next(1,100));
}    

Дадим вам лучшее распределение.

3
ответ дан Mathieu Borderé 28 November 2019 в 04:15
поделиться

Генераторы случайных чисел должны поддерживать состояние, чтобы быть «случайным». Генератор случайных чисел создает последовательность, которая генерируется на основе случайного начального числа. Проблема в том, что в компьютере нет ничего случайного. Самая близкая вещь, которую компьютер имеет под рукой, - системные часы; это фактически время, в которое происходит процесс. Таким образом, по умолчанию используется текущий счетчик системных часов. Если ваше приложение достаточно быстрое, тогда многие вычисления случайных чисел могут выполняться под одним и тем же системным тиком. Если генератор случайных чисел вообще не поддерживает состояние, он будет выдавать одно и то же случайное число несколько раз (один и тот же вход дает один и тот же выход). Обычно это не то, что вы хотите.

Я знаю, что он уже ответил, но я просто должен сказать, что я предпочитаю использовать шаблон синглтона в этом случае.

1
ответ дан Jordan 28 November 2019 в 04:15
поделиться

Вам понадобится что-то подобное, если вам нужен упомянутый синтаксис.

namespace MyRandom
{
    public class Random
    {
        private static m_rand = new Random();
        public static Next(int min, int max)
        {
            return m_rand.Next(min, max);
        }
    }
}

Это должно позволить вам выполнять Random.Next (1,100); , не беспокоясь о раздаче.

-1
ответ дан 28 November 2019 в 04:15
поделиться

Это не «лишнее», потому что класс Random хранит некоторое состояние внутри. Это делается для того, чтобы быть уверенным, что если вы вызовете .Next () несколько раз очень быстро (за одну и ту же миллисекунду, тик или что-то еще), вы все равно не получите тот же номер.

Конечно, если это не проблема в вашем случае, вы всегда можете объединить эти две строки кода в одну:

new Random().Next(1, 100);
6
ответ дан 28 November 2019 в 04:15
поделиться

From MSDN: Random Class (System) :

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

Википедия объясняет ГПСЧ

5
ответ дан 28 November 2019 в 04:15
поделиться

Создание кратковременного экземпляра на C # почти бесплатно. Не тратьте время на беспокойство об этом. Вероятно, у вас есть места получше, чтобы посмотреть на производительность или прирост памяти.

1
ответ дан 28 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: