Вопрос по random, c# – Сгенерированные случайные числа всегда равны [дубликат]

1

This question already has an answer here:

Random number generator only generating one random number 9 answers

У меня есть класс:

public class MyClass
{
    public int MyMethod()
    {
        Random rand = new Random();

        return rand.Next() % 10 + 1;
    }
}

И 2 объекта этого:

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

Проблема в том, чтоobj1.MyMethod() == obj2.MyMethod() всегда. Почему это происходит? Какой лучший способ избежать этого?

Ваш Ответ

2   ответа
0

Random каждый раз. Когда экземплярRandom  без явного указания начального значения, которое он используетSystem.DatTime.Now.Ticks как семя. Из-за скорости вызовов они происходят в один и тот же «тик». поэтому используется то же самое начальное значение. Поскольку все случайные экземпляры генерируют одну и ту же последовательность «случайных» число для одного и того же начального значения одинаковое «случайное» значение генерируется обоими экземплярами.

Об этом уже много раз говорилось на сайте, и вы должны искать один из этих ответов.

Но в основном вам нужно создать свойRandom возражать один раз и использовать его снова. Это может быть сделано статически или, по крайней мере, как переменная класса.

Вы должны прочитатьэтот вопрос и его ответы, чтобы найти лучший подход.

он имеет в виду это Random rnd = new Random ((int) DateTime.Now.Ticks);
9

public class MyClass
{
   public static Random rand = new Random();

   public int MyMethod()
   {
       return rand.Next() % 10 + 1;
   }
}

Случайные работы наSystem.DatTime.Now.Ticks.

Если мы делаем это

Random rand = new Random();

внутренне это происходит как

Random rand = new Random(System.DateTime.Now.Ticks);

Подумайте на мгновение, единственное, что не является постоянным в системе, это системное время.

Когда вы используете класс Random, сделайте его объект один раз и используйте его методNext() Где бы ты не хотел. Вы найдете эту ситуацию в циклах, когда внутри циклов создается случайный объект.

В вашем коде они создаются один за другим, они создаются одним и тем же начальным значением Ticks.

Создайте статический случайный объект, и тогда он не будет таким же.

@NikhilAgrawal да ответ Марка Гравелла.
@SamHolder: Марк Марк Гравелл ответит?
Спасибо за четкое объяснение. Я приму, как только система позволит. Leri
Увидетьthis answer почему ваша статическая реализация может быть небезопасной. Вам необходимо заблокировать доступ кrand.Next предотвратить возможное внутреннее повреждение экземпляра Random

Похожие вопросы