【发布时间】:2021-07-31 15:27:21
【问题描述】:
我正在研究一种算法(程序赛道生成器),其结果在一般情况下完全基于 RNG 输出。但在某些特定场景中,我需要为用户提供绕过某些生成步骤(例如地形构造)而不影响其余生成过程的能力。
让我做一个简单的实际例子:
## 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 |
如您所见,在 用户覆盖赛道的情况下,地形生成步骤被绕过(因此不消耗 RNG 输出)这一事实改变了所有随后的生成步骤。在不同的赛道生成中,每个生成步骤所需的 RNG 输出数量并不恒定(甚至无法提前预先确定)。
我正在寻找的是某种 RNG 同步操作(可能不是最正确的术语...)放在 地形生成之间步骤和 表面生成 步骤从 * 开始具有相同的 RNG 流,无论地形是否由用户提供。我想到了类似的东西:
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 存储库的 Issues 部分提交的问题:https://github.com/imneme/pcg-cpp/issues/72
【问题讨论】:
-
相关:stackoverflow.com/questions/64965398/… 不过,您的问题并非特定于 PCG;与另一个伪随机数生成器相比,这不是 PCG 的问题。
-
确实,使用另一个 RNG(例如 mt19937)我也会遇到同样的问题。我使用 PCG 是因为我的种子(对应于赛道 ID)是
uint32_t数字,据我所知,PCG 是使用 32 位数据播种时产生最佳结果的 RNG。
标签: random random-seed