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