Можно ли обратить вспять генератор псевдослучайных чисел?

Можно ли обратить вспять генератор псевдослучайных чисел? Например, возьмите массив сгенерированных чисел и получите оригинальное начальное число. Если так, как это будет реализовано?

3 ответа

Это абсолютно возможно - вам просто нужно создать PRNG, который соответствует вашим целям. Это зависит от того, что именно вам нужно сделать - я был бы рад предложить вам больше советов, если вы опишите вашу ситуацию более подробно.

Для общего понимания, вот некоторые ресурсы для инверсии линейного конгруэнтного генератора: Обратимый генератор псевдослучайных последовательностей

псевдослучайное распределение, которое гарантирует все возможные перестановки последовательности значений - C++

И вот некоторые из них для переворачивания твистера Мерсенна: http://www.randombit.net/bitbashing/2009/07/21/inverting_mt19937_tempering.html http://b10l.com/reversing-the-mersenne-twister-rng-temper-function/

В общем нет. Это должно быть возможно для большинства генераторов, если у вас есть полный массив чисел. Если у вас нет всех чисел или вы не знаете, какие у вас есть номера (у вас 12-е или 300-е?), Вы вообще не сможете понять это, потому что не знаете, где остановиться.

Вы должны были бы знать детали генератора. Декодирование линейного конгруэнтного генератора будет отличаться от такового для PRNG на основе счетчика, который будет отличаться от твистера Мерсенна, который будет отличаться от генератора Фибоначчи. Кроме того, вам, вероятно, нужно знать параметры генератора. Если у вас есть все это И уравнение для генерации числа обратимо, то это возможно. Что касается того, как, это действительно зависит от PRNG.

Используйте язык Янус , обратимый во времени язык для выполнения обратимых вычислений.

Вероятно, вы могли бы сделать что-то вроде создания программы, которая делает это (псевдокод):

      x = seed
x = my_Janus_prng(x)
x = reversible_modulus_op(x, N) + offset

Янус может дать вам программу, которая берет выходное число и любые другие данные, необходимые для инвертирования всего, и дает вам программу, которая заканчивается на x = seed.

Я не знаю всех подробностей о Янусе или о том, как вы могли это сделать, но просто подумал, что упомяну об этом.

Очевидно, что то, что вы хотите сделать, вероятно, является лучшей идеей, потому что, если ГСЧ не является инъективной функцией, то на что она должна отображаться и т. д.

Итак, вы хотите написать программу Janus, которая выводит массив. Входные данные для перевернутой программы Януса будут принимать массив (в идеале).

Другие вопросы по тегам