Я работаю над алгоритмом (процедурным генератором ипподрома), результат которого, в общем случае, основан исключительно на выходных данных ГСЧ. Но в некоторых конкретных сценариях мне нужно предоставить пользователю возможность обойти некоторые этапы генерации (например, согласование местности), не влияя на остальную часть процесса генерации.
Приведу простой практический пример:
## Procedural racetrack ##
*
| Track shape generation | Terrain generation | Surfaces generation | Assets picking |
RNG stream | 1 2 3 | 4 5 6 7 | 8 9 | 0 |
## User-overridden racetrack ##
*
| Track shape generation | Terrain generation | Surfaces generation | Assets picking |
RNG stream | 1 2 3 | provided by user | 4 5 | 6 |
Как вы можете видеть, в случае ипподрома, переопределенного пользователем, тот факт, что этап генерации ландшафта пропущен (и поэтому выходной сигнал ГСЧ не используется) изменяет всю последующую генерацию шаги. Количество выходов ГСЧ, необходимых для каждого шага генерации, не является постоянным для разных поколений гоночных треков (и даже не может быть заранее определено заранее).
Я ищу своего рода операцию синхронизации ГСЧ (вероятно, не самый исправленный термин для использования ...), который можно использовать между этапом Генерация ландшафта и этапом Создание поверхностей, чтобы получить тот же поток ГСЧ, начиная с *
, независимо от того, предоставлен ли ландшафт пользователем или нет. Я подумал о чем-то вроде:
uint64_t seed = // initialized with racetrack ID
pcg32 rng(seed);
// Do Track shape generation step
// Do Terrain generation generation step
seed = seed + k; // where k is some constant
rng.seed(seed);
// Do Surfaces generation step
// Do Assets picking step
Но я не знаю, seed = seed + k
; является допустимым подходом к пересеву (или есть что-то лучше), и если какое-то значение лучше других для k
.
Ссылка на вопрос, изначально заданный в разделе Проблемы репозитория PCG: https://github.com/imneme/pcg-cpp/issues/72
uint32_t
числами, и, насколько я понял, PCG - это ГСЧ, который дает наилучшие результаты, если засеять 32 бита данных. - person TaaTT4   schedule 10.05.2021