#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() не потокобезопасен.
Комментариев нет:
Отправить комментарий