Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Почему не успевают генерироваться случайные числа? [дубликат]

#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() не потокобезопасен.

Комментариев нет:

Отправить комментарий