Случайность.Далее возвращает всегда одинаковые значения [дубликат]


этот вопрос уже есть ответ здесь:

Это действительно странно, и я не могу понять, почему это происходит. В цикле 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();
 }
}
4   52  

4 ответа:

проблема в том, что вы создаете экземпляры Random класс слишком близко по времени.

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

создать один Random объект и передать его ссылку на конструктор при создании экземпляров класса "a", вместо создания одного Random объект для каждого "a" пример.

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

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

вы, вероятно, знаете этот следующий бит, но я включу его здесь для полноты:

The MSDN подробностями об этом, но в основном ваша проблема-это случайные.Далее способ вы используете генерирует:

32-разрядное целое число со знаком больше или равно minValue и меньше maxValue; то есть диапазон возвращаемых значений включает minValue, но не maxValue. Если minValue равно maxValue, возвращается minValue.

из-за этого ваши звонки будут возвращать -1 или 0.

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

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

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