В дополнение к AKF, существует Transactional Auto Scaler (TAS), языковая карта шаблонов масштабируемости (SPLM) и человек, достигший повсеместного производства (PAUM) ... Этот pdf описывает модели оценки (Количественный / Качественный) масштабируемости, в различных областях, таких как: производственные системы, компьютерные науки, организационные и бизнес.
Edit1
Если вышеупомянутые модели не измеряют или, по крайней мере, помогают измерить -Я думаю, пожалуйста, рассмотрите это исследование , чтобы измерить масштабируемость, которая обсуждает несколько техники.
Масштабируемость может быть измерена в различных измерениях, таких как:
Административная масштабируемость: способность растущего числа организаций или пользователей легко совместно использовать одну распределенную систему. Функциональная масштабируемость: способность улучшать систему за счет добавления новых функций при минимальных усилиях.
Географическая масштабируемость: способность поддерживать производительность, полезность или удобство использования независимо от расширения от концентрации в локальной области до более распределенной географической структуры.
Масштабируемость нагрузки и т. Д.
AKF
выглядит как модель, а не как подход к измерению масштабируемости, из определения:
«Куб Scale помогает командам сохранять критические измерения масштаба системы in mind
при разработке решений и при создании существующих систем. are being improved
. "
Лучше всего создать один экземпляр Random
и использовать его во всей программе, иначе результаты могут быть не такими случайными. Такое поведение поощряется тем, что не создается статическая функция.
Вам не следует беспокоиться о «создании экземпляра без надобности», влияние в лучшем случае незначительно - так работает фреймворк.
//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);
}
}
Вы уже получили ответы здесь. Просто повторяя правильное решение :
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();
Мало того, что оно медленнее (внутри цикла), это случайность ... ну, на мой взгляд, не очень хорошо ...
Почему бы и нет?
Вам необходимо создать экземпляр, поскольку способ генерирования случайных чисел заключается в том, что предыдущие ответы влияют на последующие ответы. По умолчанию конструктор 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
необходимо хранить данные экземпляра (предыдущий ответ или «начальное число») для последующих вызовов.
Создание нового экземпляра 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));
}
Дадим вам лучшее распределение.
Генераторы случайных чисел должны поддерживать состояние, чтобы быть «случайным». Генератор случайных чисел создает последовательность, которая генерируется на основе случайного начального числа. Проблема в том, что в компьютере нет ничего случайного. Самая близкая вещь, которую компьютер имеет под рукой, - системные часы; это фактически время, в которое происходит процесс. Таким образом, по умолчанию используется текущий счетчик системных часов. Если ваше приложение достаточно быстрое, тогда многие вычисления случайных чисел могут выполняться под одним и тем же системным тиком. Если генератор случайных чисел вообще не поддерживает состояние, он будет выдавать одно и то же случайное число несколько раз (один и тот же вход дает один и тот же выход). Обычно это не то, что вы хотите.
Я знаю, что он уже ответил, но я просто должен сказать, что я предпочитаю использовать шаблон синглтона в этом случае.
Вам понадобится что-то подобное, если вам нужен упомянутый синтаксис.
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);
, не беспокоясь о раздаче.
Это не «лишнее», потому что класс Random хранит некоторое состояние внутри. Это делается для того, чтобы быть уверенным, что если вы вызовете .Next ()
несколько раз очень быстро (за одну и ту же миллисекунду, тик или что-то еще), вы все равно не получите тот же номер.
Конечно, если это не проблема в вашем случае, вы всегда можете объединить эти две строки кода в одну:
new Random().Next(1, 100);
From MSDN: Random Class (System) :
«Генерация случайных чисел начинается с начального значения. Если одно и то же начальное число используется неоднократно, генерируется одна и та же серия чисел. Один из способов создания разных последовательностей - сделать начальное значение зависит от времени, тем самым создавая разные серии с каждым новым экземпляром Random. По умолчанию конструктор без параметров класса Random использует системные часы для генерации своего начального значения , в то время как его параметризованный конструктор может принимать Int32 значение, основанное на количестве тактов в текущем времени. Однако, поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания различных объектов Random в близкой последовательности создает генераторы случайных чисел, которые производят идентичные последовательности случайных n Амберс .В следующем примере показано, что два объекта Random, экземпляры которых создаются в тесной последовательности, генерируют идентичную серию случайных чисел ... "
Создание кратковременного экземпляра на C # почти бесплатно. Не тратьте время на беспокойство об этом. Вероятно, у вас есть места получше, чтобы посмотреть на производительность или прирост памяти.