Случайность.Далее возвращает всегда одинаковые значения [дубликат]
этот вопрос уже есть ответ здесь:
Это действительно странно, и я не могу понять, почему это происходит. В цикле 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 ответа:
проблема в том, что вы создаете экземпляры
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.