mihaild писал(а):
Чтобы блочные шифры не выглядели магией "вот тут так переложите биты, и не спрашивайте, почему", нужно потратить больше времени, чем обычно есть в курсе.
Магия будет и при LCG в духе "вот константы, кривыми руками не трогать, а то плохо будет". А чтобы их подобрать - нужно изучать хотя бы второй том Кнута, уметь запускать спектральный тест, BigCrush и PractRand. Ну и в шифре тоже константы. А вообще что качественный ГПСЧ в виде шифра может оказаться "черным ящиком" - это нормально, всё в жизни освоить нельзя. Впрочем, простейшие опыты в духе "сделай свой некриптографический ГПСЧ на основе сети Фейстеля, измеряя лавинный эффект и гоняя PractRand" - это вообще уровень продвинутой лабораторки, т.е. сам принцип показать можно. И для многопоточных случаев это будет даже проще LCG. А если не углубляться в теорию, то ChaCha с напутствием "вот константы, вот алгоритм, вот тестовые вектора, кривыми руками не лезть" - вполне нормально.
Цитата:
На самом деле обычно можно.
"Обычно" - это где? У меня получается, что 32-битный LCG - почти нигде нельзя, особенно если там m=2^32:
1) Интегрирование по Монте-Карло? Да ни в коем случае.
2) Рассчитать какой-то квантиль распределения тем же методом Монте-Карло, например, для Dixon's Q-test? Да у него период раньше закончится, чем мы получим хотя бы "до 4 знака после запятой".
3) Оценить погрешность косвенного измерения без дифференцирования? Тоже нельзя.
4) Выбрать грань игрального кубика в игре по формуле

? Опять ерунда получается.
5) Выбрать пивот для QuickSort? Тут очень желателен вообще системный API для генерации криптографических ключей.
6) Сгенерировать "белый шум" на экране? Так кто ж знает, что получится-то, опять засада.
7) Нарезать вывод на байты и получить равномерное распределение? Ничего не выйдет, т.к. такой ГПСЧ не подчиняется равномерному распределению.
8) Моделировать какой-то процесс из теории массового обслуживания? Лучше не надо.
Вот и получается, что ничего нельзя. Если уж показывать LCG, то нормальный, хотя бы вот такой, он хотя бы проходит BigCrush и PractRand и пригоден для использования в математической статистике (ссылку приводил ранее). И очень быстрый:
Код:
uint32_t MWC64X(uint64_t *state)
{
uint32_t c=(*state)>>32, x=(*state)&0xFFFFFFFF;
*state = x*((uint64_t)4294883355U) + c;
return x^c;
}
Он приличный, т.к. там довольно большой простой делитель и "плохих младших бит" просто нет, а выход дополнительно скремблируется побитовым XOR. И уж эта шарманка точно проще генератора Wichmann-Hill-1982.
Цитата:
Там нет сравнения с другими вариантами.
Другие варианты на древнем железе были бы 0.5-1.5 cpb, ChaCha12 - около 7 cpb, устаревший и тормознутый 3DES - ближе к 100 cpb. Т.е. уже 20 лет назад шифры позволяли генерировать псевдослучайные числа со скоростью порядка сотен мегабайт в секунду, что обычно вполне достаточно. А недостаточно таких скоростей весьма специфическим людям, которые вполне могут написать свои ГПСЧ, скоростные.
Цитата:
Я могу оценить поведение линейной рекурренты в уме без статистических тестов :)
Не можете: одно выполнение спектрального теста Кнута займет в лучшем случае неделю "на бумажке". А базовая эмпирическая проверка качества линейной конгруэнции вручную невозможна, т.к. продолжительность человеческой жизни - обычно не более 4 гигасекунд, и человек не успеет провести нужный объем вычислений. Общепринятая же проверка качества некриптографического ГПСЧ вручную потребует десятки миллионов лет.
-- 19.11.2025, 19:57 --Евгений Машеров писал(а):
Если мы встретим в выдаче ГСЧ ряд из тысячи нулей без единой единицы, то заподозрим. что это плохой ГСЧ. Но в последовательности независимо появляющихся случайных нулей и единиц должен появиться такой ряд, иначе это уже не будут независимые величины, получив 999 нулей, мы тогда сможем точно угадать следующее - единицу.
Не сможем угадать, вероятность того, что следующее - 1, все равно 0.5. Также все эти вопросы решаются через понятие колмогоровской сложности - минимальной длины программы, которой можно представить последовательность. И 1000 нулей подряд хорошо сжимаются. Впрочем, если последовательность длиннее 2^1000, то рано или поздно мы на подобные блоки нулей нарвемся. Но выиграть на сжатии не получится из-за накладных расходов на указание позиции в потоке и т.п.
Цитата:
Если нам нужен ГСЧ для криптографии - важнее всего непредсказуемость, если для Монте-Карло - равномерность.
Равномерность для метода Монте-Карло - это ослабленный вариант непредсказуемости, рожденный в эпоху слабости компьютеров и секретности криптографии. И качественный поточный шифр пригоден как ГПСЧ для метода Монте-Карло, иначе он не был бы шифром.
Цитата:
моя байка из студенческих времён, о "супер-ГСЧ")
Комбинированные генераторы - вещь достаточно известная, см. семейство KISS от Марсальи, но он делал для равномерного распределения.
Цитата:
а менять на новый - труд, и немалый.
Естественно, это - труд. И если уж его проделывать, то, возможно, надо менять сразу на поточные шифры.