Как синхронизировать c PRNG между C # / Unity и Python? - PullRequest
0 голосов
/ 20 января 2020

У меня есть игра, реализованная в Unity / C#, которая генерирует простые среды с использованием встроенного PRNG (UnityEngine.Random). Я пытаюсь переопределить процедуру генерации среды в Python 3. Мне нужно, чтобы генераторы случайных чисел были синхронизированы, чтобы при наличии одинакового начального числа действительная игра в Unity и переопределение Python генерировали точно такую ​​же среду. Каков наилучший подход к синхронизации двух платформ?

Некоторые решения, которые я рассмотрел до сих пор:

  • Попытка переопределить генератор случайных чисел по умолчанию Python (random) в C#. Исходный код доступен, но довольно длинный, поэтому его сложно реализовать на практике.
  • Попытка переопределить UnityEngine.Random в Python. Однако у меня нет исходного кода, и даже если бы я знал, какой класс PRNG использовал, я не могу гарантировать, что смогу успешно переопределить его точно так же.
  • Реализация того же PRNG в обе. Тем не менее, я не знаю, что хороший вариант для PRNG для моего случая использования. Мне в основном нужно что-то, что выглядит случайным (хотя это не обязательно должно быть безопасным) и на сборку которого уходит не более часа или двух. Википедия имеет длинный список PRNG, и я понятия не имею, насколько сложно реализовать каждый из них.
  • Или, может быть, кто-то еще сделал это в какой-то момент ...? Хотя я ничего не мог найти в Интернете.

Любые предложения по лучшему подходу или простой PRNG, который я могу легко реализовать как в C#, так и Python?

Спасибо!

1 Ответ

1 голос
/ 21 января 2020

В общем, лучший способ "синхронизировать c" PRNG между двумя программами на разных языках - это реализовать один и тот же PRNG на обоих языках.

Для ваших целей, линейный конгруэнтный генератор (LCG) простой PRNG, если вы хотите только «что-то, что выглядит случайным (хотя это не обязательно должно быть безопасным)». Этот тип генератора тривиален для реализации как C#, так и Python.

Одним из примеров, среди многих других возможностей, является следующий 32-разрядный LCG (где x - начальное число):

C#:

// Generate the next x from the current one.
unchecked {
    // NOTE: x is an `int`
    x = (0xadb4a92d * x) + 9999999;
}

Python:

# Generate the next x from the current one.
x = ((0xadb4a92d * x) + 9999999) & 0xFFFFFFFF

См. Раздел 8 самой недавней статьи Стила и Виньи для других вариантов параметров.

Однако LCG далеко не идеальны , (Например, вышеупомянутый LCG производит x со слабыми младшими битами.) Если вы хотите другой выбор для PRNG, я перечислю многие из них .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...