Я пытаюсь построить PRNG байтов, где я могу взять набор байтов (скажем, 10 или 15 байтов) и вернуть список начальных значений, который бы вывел этот список байтов.Я не беспокоюсь о криптографии, но она должна быть примерно равномерно распределена, она должна охватывать все возможные комбинации 2 ^ 8 и иногда должна иметь возможность повторять число без застревания.
Проблема в том, что большинствоАлгоритмы, о которых я читал, либо используют шифры, что, вероятно, означает, что они не допускают повторов, либо используют модули или некруглые сдвиги, которые вызывают потери и делают реверсирование функции в лучшем случае нецелесообразным.Кроме того, если бы алгоритм использовал подсчет, было бы трудно работать в обратном направлении, поскольку входной список байтов не знал бы, какой был внутренний счетчик PRNG во время генерации.
Я понимаю, что я ищу, этоСитуация "сделай свой пирог и съешь это тоже", но я хотел убедиться, что не было другого решения, которое мне не хватало.
Во время поиска я наткнулся на этот пост который имеет аналогичные требования.Я писал на C #, но на самом деле синтаксис не важен.
Каждый алгоритм, который я пытался написать сам, был шифром и поэтому не мог повторяться и / или не был равномерным в распределении.Я использовал инверсию, круговое смещение и маскировку семян.