PHP генератор псевдослучайных чисел

380
08 сентября 2017, 23:00

Здравствуйте! Есть набор чисел от 0 до 15 включительно, их около 70. Нужен ГПСЧ, который сможет сгенерировать все эти числа используя какой-то seed. В общем, нужен легко обратимый ГПСЧ для этой задачи, чтобы так же ещё мог легко вычислить seed, по которому были сгенерированы данные числа. Что посоветуете? Пишу на php. Сами числа были сгенерированы на perl.

Answer 1

В PHP есть встроенный генератор случайных чисел: rand()

Читай/изучай, что в твоей задаче подходит лучше всего.

По поводу seed:

Ты либо задаешь его сам изначально и получаешь воспроизводимую ситуацию или его генерирует система в момент запроса.

Если же тебе надо по числам найти seed, то это не тривиальная математическая задача:

вот в этой статье можно найти постановку такой задачи (раздел Линейный конгруэнтный ГПСЧ(LCPRNG))

если очень надо - то можно написать код для вычисления seed (решения этой задачи соответсвенно)

Answer 2

Восстановление "генератора" по набору его отсчетов сводится к восстановлению трех параметров: алгоритма генерации, внутреннего состояния генератора, алгоритма преобразования сырых отсчетов генератора в имеющиеся данные.

Существует множество генераторов: Type3-генератор, msvcrt-генератор, Mersenne Twister, WinAPI, OpenSSL и так далее. Первые три определенно могут использоваться в PHP. Операционная система, параметры сборки и прочее могут влиять на алгоритм генерации.

Внутреннее состояние зависит от типа генератора. MSVCRT, Type3 используют 32-битное целое для состояния, фактически - seed. Mersenne Twister имеет внутреннее состояние значительно большего размера, оно меняется при получении каждого отсчета. WinAPI определенно умеет подмешивать новые данные в состояние, OpenSSL вроде тоже.

В простейшем случае (Type3, msvcrt, Mersenne Twister) выдает 32-битное целое в качестве результата. Дальше с ним должны проводиться преобразования для получения нужного диапазона значений. Ваши данные похожи на data[i] = random_raw() & 0x0F или, что тоже самое в данном случае data[i] = random_raw() % 16

Общий метод - выдвигается гипотеза о типе генератора, о преобразовании и потом проверяется для каждого сида. Если тройка генератор-сид-преобразование дает ту же последовательность - можно говорить о том, что эта тройка могла (но не должна была!!!) быть использована для генерации.

READ ALSO
Хранение конфигурации в файле

Хранение конфигурации в файле

У меня есть список настроек которые пользователь(администратор) может менять в интерфейсе web приложенияКак правило в таких случаях настройки...

185
Как можно получить свою текущую прямую трансляцию из ютуба через api?

Как можно получить свою текущую прямую трансляцию из ютуба через api?

Не могу в документации найти метод, который бы возвращал мне мои прямые трансляции в текущий моментМожет кто знает, поможет?

236
Как загружать статьи из mysql через ajax

Как загружать статьи из mysql через ajax

Допустим есть бд в которой мои статьиНа главную страницу при загрузке выводится 10 статей

249
Как компилировать less файлы из консоли PHPixie?

Как компилировать less файлы из консоли PHPixie?

Внимание! Этот вопрос является переводом вопроса: How to compile less files via console command in PHPixie?

220