mihaild писал(а):
Давайте возьмем двух студентов, я буду объяснять одному LCG, Вы другому ChaCha, и посмотрим, чей студент быстрее напишет реализацию без ошибок
Для ChaCha достаточно объяснить, что есть стандарт RFC, в котором она описана прямо вместе с тестовыми векторами, а также один неочевидный нюанс с размером счетчика. В результате средствами С99 она реализуется быстро и просто. Суть тоже простая: берут 16 32-битных слов, инициализируют, обратимо перемешивают особой функцией биты, и в конце добавляют поэлементно выход к входу. В случае же качественного LCG мне придется объяснять какой-то вариант длинной арифметики и конструирование матриц перехода для обеспечения многопоточности. Самые эффективные варианты длинной арифметики с подбором множителей специального вида для таких генераторов вообще на русский не переводились, и до состояния "учебное пособие" не разжевывались, там хватает умолчаний и коварных моментов. Возни точно будет больше, чем с ChaCha.
Цитата:
И я не очень удивлюсь, если какие-то реализации для экзотического железа используют
На экзотическом железе много чего может быть, там вообще может и математической библиотеки не быть, и аппаратной плавающей запятой не быть. Но это не повод на нормальном железе пихать в функцию rand() аналоги Вашей упрощенной реализации синуса. И то, даже для микроконтроллера есть примитивные, строк так на 15, некриптографические ГПСЧ, которые прекрасно проходят TestU01 и PractRand, и могут даже без умножения обойтись, и памяти потреблять мало. Получается, что всей это вакханалии в rand() стандартных библиотеках Си вообще нет оправдания, это просто раздолбайство и недостаток знаний. И, кстати, m68k - 32-разрядные, все нужные для ARX-шифров операции там есть.
И тем не менее: если бы на обычной рабочей станции x86-64 функция sin(x) имела бы точность 6 знаков после запятой для double - это сочли бы багом. Но в случае rand() подобное почему-то считают нормой.
Цитата:
Я бы сказал, что наоборот.
Не вполне понимаю, почему: хороший шифр не требует размышлений о качестве ГПСЧ от пользователя, он просто использует seed - и пользуется. И не думает, хорошие ли там младшие биты, какой там ранг матрицы, есть ли решетки и т.п.
-- 19.11.2025, 02:55 --sergey zhukov писал(а):
Любая псевдослучайность чем-то, да грешит.
Разумеется. Но в случае ГПСЧ единственно объективный критерий качества - это тест на следующий бит, который вульгаризованно формулируется так: человечеству не должен быть известен способ отличить вывод ГПСЧ от случайного меньше, чем за 2^128 операций.
Цитата:
Какая "точность", для чего и когда достаточна?
Для научных и инженерных расчётов. При использовании шифров шансы нарваться на артефакты ГПСЧ резко снижаются.
Цитата:
Так может, стоит 30 цифр после запятой "в общих вычислениях" использовать?
И тут есть интересный момент: в некоторых случаев замена LCG (RANLUX, minstd, Wichmann-Hill) на шифр ведет не к замедлению, а к ускорению работы генератора, иногда - в разы. И артефакты ГПСЧ куда коварнее ограниченности точности вычислений с плавающей запятой, т.к. у каждого некриптографического генератора могут быть свои "фирменные" дефекты. Проще использовать шифры по умолчанию, чем тратить время на исследование "приколов" конкретного алгоритма.