Random.Next возвращает всегда одни и те же значения
Это действительно странно, и я не понимаю, почему это происходит. В цикле foreach я повторяюсь через коллекцию класса A, и для каждого класса я вызываю метод Count()
, где числа r1
и r2
генерируются из диапазона [-1,1]. Проблема в том, что Random.Next
возвращает одинаковые "случайные" числа для каждого экземпляра. Когда результаты для первого экземпляра равны 0 и -1, одни и те же будут возвращены из следующих экземпляров. Пожалуйста, не могли бы вы сказать мне, почему это происходит? Кроме того, я не могу получить разные результаты в каждом экземпляре класса А. Это код:
class a
{
Random rnd = new Random();
private void Count()
{
int r1 = rnd.Next(-1, 1);
int r2 = rnd.Next(-1, 1);
}
}
class b
{
List<a> listofA=new list<a>();
foreach (a ACLASS in listofA)
{
ACLASS.Count();
}
}
Ответы
Ответ 1
Проблема заключается в том, что вы создаете экземпляры класса Random
слишком близко к времени.
Когда вы создаете объект Random
, он засевается значением из системных часов. Если вы создадите экземпляры Random
слишком близко ко времени, все они будут засеяны с одинаковой случайной последовательностью.
Создайте единственный объект Random
и передайте его ссылку на конструктор при создании экземпляров класса "a" вместо создания одного объекта Random
для каждого экземпляра "a".
Ответ 2
Вы создаете новый экземпляр Random
очень близко друг к другу (ваш цикл очень плотный), поэтому каждый экземпляр эффективно использует одно и то же начальное значение.
Лучшим подходом было бы создать один экземпляр и передать его вашему методу Count
.
Вероятно, вы знаете этот следующий бит, но я буду включать его здесь для полноты:
MSDN содержит информацию об этом, но в основном ваша проблема заключается в Random.Next, который вы используете, генерирует:
32-разрядное целое число со знаком, большее или равное minValue и меньшее, чем maxValue; то есть диапазон возвращаемых значений включает minValue, но не maxValue. Если minValue равно maxValue, возвращается minValue.
из-за этого ваши вызовы возвратят -1 или 0.
Ответ 3
Используйте один, статический генератор случайных чисел для всех экземпляров класса.
class a
{
private static Random rnd;
static a() {
rnd = new Random();
}
private void Count()
{
int r1 = rnd.Next(-1, 2);
int r2 = rnd.Next(-1, 2);
}
}
Обратите внимание на изменение, чтобы дать вам номера в диапазоне -1,1, а не -1,0
Ответ 4
Вы включаете случайный экземпляр для каждого экземпляра A. Похоже, что все они получают одинаковое начальное значение по умолчанию. Вероятно, вы хотите сделать статический случайный случай для всех экземпляров A и использовать его повторно или альтернативно предоставить начальное значение экземпляру Random() в конструкторе A.