Подтвердить что ты не робот

Почему две задачи, созданные друг за другом, генерируют одно и то же случайное значение?

Task.Factory.StartNew(() =>
    {
    new Class1();
    })

Task.Factory.StartNew(() =>
    {
    new Class2();
    })

В конструкторе class1 и class2 я:

var timeout = new Random().Next(0, 5000);
Debug.Print(timeout.ToString());

Случайное значение "тайм-аут" всегда одинаково в обоих классах. Я не понимаю, почему..

Если я добавлю паузу между созданием задач, то это не то же самое.

EDIT:

Я не понимаю, как это связано с "Генератор случайных строк, возвращающий ту же строку.

Он создавал случайный экземпляр в методе. Я называю это совершенно разными Задачами, поэтому они должны быть независимыми друг от друга.

4b9b3361

Ответ 1

Я не понимаю, как это связано с "Генератор случайных строчек, возвращающих одну строчку".

Не имеет прямого отношения, хотя первопричина одна и та же. Лучшим дубликатом был бы этот вопрос: Почему я продолжаю получать два одинаковых случайных значения в этом коде?

В нем содержится объяснение того, что new Random делает - любезно предоставлено документация:

Начальное значение по умолчанию выводится из системных часов и имеет конечное разрешение. В результате различные объекты Random, которые создаются в тесной последовательности вызовом конструктора по умолчанию, будут иметь одинаковые начальные значения по умолчанию и, следовательно, будут создавать одинаковые наборы случайных чисел.

Другими словами: если вы быстро создаете объекты Random, они будут создавать одну и ту же последовательность случайных чисел.

Он создавал случайный экземпляр в методе. Я называю это совершенно разными задачами, поэтому они должны быть независимыми друг от друга.

Не имеет значения, созданы ли эти объекты в разных потоках (или Task s) - они зависят только от системного времени, когда они созданы, ни на что другое. На самом деле они независимы друг от друга, как вы сказали. Но они оба зависят от того же значения семени, которое является системным временем при создании.


Правильный способ решения этой обычно имеет только один экземпляр класса Random. - На самом деле такой код: new Random().Next(…) - это запах кода, поскольку он неправильно использует класс Random: вы не должны генерировать новый экземпляр для каждого вызова; вместо этого вы должны повторно использовать один и тот же экземпляр для генерации последовательности случайных чисел.

К сожалению, вы не можете просто использовать один и тот же экземпляр Random для разных параллельных задач, поскольку

Ответ 2

Параметрируемый конструктор класса Random использует связанный с временем способ определения начального семестра для алгоритма генерации случайных чисел.

public Random() 
  : this(Environment.TickCount) {
}

Поэтому, когда вы создаете экземпляры одновременно, они будут генерировать те же результаты.