Подтвердить что ты не робот

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();
 }
}
4b9b3361

Ответ 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.