Обеспечивает ли увеличение семян ГСЧ на 1 каждый раз, чтобы не получить одинаковые последовательные значения? - PullRequest
0 голосов
/ 02 апреля 2020

У меня был шанс увидеть какой-то интересный фрагмент кода, который либо использовался в качестве апрельской шутки (обновление стало опубликовано c 1 апреля), либо был просто ошибкой, потому что кто-то не понимал, как использовать ГСЧ.

Вопрос связан с тем, что класс Random является частью .NET / C#, но, возможно, другие ГСЧ работают так же.

Упрощенная версия кода, которую я обнаружил после вычеркивая все ненужные детали, выглядело бы так:

for ( int i = startI; i < stopI; ++i ) {
    int newValue = new Random( i ).Next( 0, 3 ); // new RNG with seed i generates a single value from 3 options: 0, 1 and 2
    // rest of code
}

Я выполнил простой тест этого кода в LINQPad, чтобы посмотреть, было ли то, что я наблюдал в программе, просто моей «удачей» или, может быть, это на самом деле, как RNG использовал этот способ будет работать. Вот код:

int lastChoice = -1;
int streakLength = -1;

for ( int i = 0; i < 100000000; ++i ) {
    int newChoice = new Random( i ).Next( 0, 3 );
    if ( newChoice == lastChoice ) {
        streakLength++;
        ( i + ";" + lastChoice + ";" + streakLength ).Dump();
    } else {
        lastChoice = newChoice;
        streakLength = 1;
    }
}

"The End".Dump();

(метод Dump() просто выводит значение на экран)

Результатом выполнения этого «сценария» стал просто «Конец», ничего более , Это означает, что для 100M циклов генерации случайного значения ни разу он не мог генерировать одни и те же последовательные значения, имея только 3 из них в качестве опции .

Итак на мой вопрос из заголовка - увеличивает ли начальное число RNG (в частности, случайный класс .NET / C#, но общий ответ также приветствуется) по одному после каждого (целочисленного) генерирования случайного числа, гарантировало бы, что повторение подряд не произойдет значения будут происходить? Или это просто удача?

1 Ответ

1 голос
/ 02 апреля 2020

Поведение, которое вы показываете, зависит от PRNG.

Для многих PRNG, включая линейные PRNG, такие как тот, который реализован в. NET Framework *, если вы инициализируете два экземпляра PRNG с последовательными начальными числами, последовательности случайных чисел, которые они производят, могут коррелироваться друг с другом, хотя каждая из этих последовательностей производит случайные числа самостоятельно. Поведение, которое вы описываете в своем вопросе, является лишь одним из возможных результатов этого.

В частности, System.Random, это явление более подробно описано в " Учебник для повторяющихся случайных чисел " .

Однако другие PRNG присваивают каждому начальному числу свою собственную независимую последовательность случайных чисел (например, SFC64 и основанные на счетчиках PRNG; см., Например, «Параллельные случайные числа: так же просто, как 1, 2, 3»). ), и некоторые PRNG могут быть «перепрыгнуты» на огромное количество шагов для получения последовательностей случайных чисел, которые не зависят друг от друга.

См. также:

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