Если вы инициализируете несколько экземпляров Random
, используя конструктор по умолчанию, Random()
, в течение короткого периода времени, то вы рискуете, что они получат одно и то же начальное значение (которое зависит от времени) и, следовательно,генерировать одну и ту же случайную последовательность каждый раз.
Эту проблему можно исправить, инициализировав один статический экземпляр Random
и поделив его между всеми Student
экземплярами.Это совершенно безопасно, если вы не многопоточны.
public class Student
{
private static readonly Random random = new Random();
}
Со страницы MSDN в конструкторе Random () :
Начальное значение по умолчанию получено из системных часов и имеет конечное разрешение.В результате различные Random
объекты, созданные в тесной последовательности при вызове конструктора по умолчанию, будут иметь идентичные начальные значения по умолчанию и, следовательно, будут создавать идентичные наборы случайных чисел.Этой проблемы можно избежать, используя один объект Random
для генерации всех случайных чисел.Вы также можете обойти это, изменив начальное значение, возвращаемое системными часами, и затем явно предоставив это новое начальное значение конструктору Random(Int32)
.Для получения дополнительной информации см. Конструктор Random(Int32)
.
Редактировать : хотя вы заявляете, что генератор случайных чисел уже является статическим членом, этовсе еще недостаточно, если вы создаете его повторно (избыточно) во время каждой Student
инициализации.Следующий код по-прежнему неверен :
public class Student
{
private static Random random;
private int[] numbers;
public Student()
{
random = new Random();
numbers = new int[10];
for (int i = 0; i < 10; ++i)
numbers[i] = random.Next();
}
}
Вам необходимо заменить его на версию, в которой экземпляр Random
создается только один раз, например:
public class Student
{
private static readonly Random random = new Random();
private int[] numbers;
public Student()
{
numbers = new int[10];
for (int i = 0; i < 10; ++i)
numbers[i] = random.Next();
}
}