У меня был шанс увидеть какой-то интересный фрагмент кода, который либо использовался в качестве апрельской шутки (обновление стало опубликовано 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#, но общий ответ также приветствуется) по одному после каждого (целочисленного) генерирования случайного числа, гарантировало бы, что повторение подряд не произойдет значения будут происходить? Или это просто удача?