Я ищу генератор псевдослучайных чисел, который является «воспроизводимым» и «без гражданства». Позвольте мне уточнить: мне нужно иметь возможность повторно получать псевдослучайное число, основанное на параметре, на случайную функцию. Например (C-стиль псевдокод):Ищете альтернативный алгоритм PRNG с возможностью повторного использования/без атак
int x1 = random(1);
int x2 = random(2);
// and so on with lots of random() calls in between
int new_x1 = random(1);
// now new_x1 is like a "replay" of x1, so x1 == new_x1
тип аргументов не имеет значения (я могу типаж все, что необходимо), возвращаемое значение не должно быть int
; в конечном итоге мне понадобятся 8-битные значения.
Вопрос в том, что хороший алгоритм PRNG, который удовлетворяет требованию о том, что следующее псевдослучайное значение контролируется параметром, а не его внутренним состоянием, которое обновляется при каждом вызове? Я не то, что использовать вшивое решение, как следующее:
int random(int input) {
srand(input);
return rand();
}
Это было бы инициализировать PRNG при каждом вызове, который, кажется дорогостоящим. (Я иллюстрирую этот момент, используя стандарт srand()/rand()
, я знаю, что там есть лучшие алгоритмы, такие как Mersenne Twister, но идея все та же.)
Вы уверены, что не просто ищете хеш-функцию? – kero
Почему вы думаете, что srand стоит дорого? Это буквально просто устанавливает семена для PRNG. –
@ ChrisHeald, потому что, например, алгоритм Mersenne Twister инициализирует 624 состояния при посеве. Кажется, слишком сложно сделать это, чтобы получить одно следующее псевдослучайное число. –