#c_sharp #случайные_числа
На этот вопрос уже дан ответ здесь:
C# случайные числа
(1 ответ)
Закрыт 3 года назад.
Столкнулся с такой неприятной ситуацией. Нужно получить два случайных числа из одного
метода. Сначала, в переменную X помещаем возвращаемое значение метода Remove, затем
в Y снова помещаем результат работы того же метода.
Мне выводит одни и те же числа, например: (80; 80), (-3; -3) и тп. Хотя через построчный
Debug выводит разные X и Y. Такое чувство, что VisualStudio слишком быстро работает
и Random не успевает сгенерировать новое число.
Вот код:
int x1, y1;
x1 = circle1.Remove();
y1 = circle1.Remove();
Console.WriteLine("(" + x1 + "; " + y1 + ")");
Ведомый метод:
public int Remove()
{
Random rnd = new Random();
return rnd.Next(-99, 99);
}
Ответы
Ответ 1
Предложенный мой вариант с задержкой лучше рассматривать в самом крайнем случае, а еще лучше не рассматривать. Лучше сделать как советует Vladislav Khapin class Circle { private static Random rnd = new Random(); public int Remove() { return rnd.Next(-99, 99); } }Ответ 2
Конструктор без параметров у класса Random() использует внутри себя Environment.TickCount как seed и, поскольку вы инициализируете объект Random 2 раза за короткий промежуток времени, высока вероятность того, что seed у двух объектов класса Random будет одинаковый. Это и приводит к одинаковым числам. Соответственно - или использовать один объект класса Random или обеспечивать каждый раз уникальность seed. Как вариант реализации первого варианта - вынести объект Random как приватное статическое поле\свойство в классе, который у вас реализует метод Remove(), правда, стоит учитывать, что метод Next() не потокобезопасен.
Комментариев нет:
Отправить комментарий