Функция rand() в С++ генерирует четное и нечетное число с периодическим числом 3276800, кто знает, почему?

for(int j=0;j<2;j++)
{
    for(int i=0;i<3276800;i++)
    {
        cout<<(rand()%2)<<'\n';
    }
    cout<<endl;
}

Первые 3276800 и второй 3276800 одинаковы. Число rand() не одно и то же, но одинаковность одинакова; почему?

Ответ 1

RNG, используемый большинством реализаций rand, представляет собой линейный конгруэнтный генератор . Они, как правило, имеют очень плохие периоды в младших битах; очень наивные реализации могут иметь период всего 2 в младшем разряде (т.е. чередуя 0 и 1).

Лучшие реализации возвращают только высокие 16 бит случайного значения, отбрасывая низкокачественные младшие разряды. В такой реализации бит младшего разряда будет иметь период не более 2 ^ 16 = 65536. Так как 65536 равномерно делит 3276800, вы увидите периодический шаблон.