Сгенерированные случайные числа всегда равны [дубликат]

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)

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

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

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

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

 15 мая 2012 г., 11:43
он имеет в виду это Random rnd = new Random ((int) DateTime.Now.Ticks);
Решение Вопроса

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.

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

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

Ваш ответ на вопрос