【问题标题】:Rebase PCG seed变基 PCG 种子
【发布时间】: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


【解决方案1】:

这归结为为您的四个(或更多)生成阶段(在您的示例中,轨道形状生成、地形生成、表面生成和资产拾取)中的每一个分配一个单独的 PRNG,并为每个阶段分配一个种子其中。 (在您的情况下,一种可行的方法是形成赛道 ID、每个生成阶段的 ID 和固定位串的哈希,并将该哈希用作每个 PRNG 的种子。)

但是,一般来说,您选择的种子可能很重要,在实践中如果在理论上不是。

例如,对于许多 PRNG,给定的播种策略将产生相关的伪随机数序列。例如,在大多数 PCG 版本中,从种子生成的两个序列仅在高位 will be highly correlated 上有所不同(“来自同一生成器的子序列”)。

为了降低相关伪随机数的风险,您可以使用 PRNG 算法,例如 SFC 和其他所谓的“基于计数器”的 PRNG(Salmon 等人,“Parallel Random Numbers: As Easy as 1, 2, 3", 2011),通过为每个种子提供自己独立的伪随机数序列来支持独立的伪随机数“流”。 (但请注意,PCG has a flawed notion of "streams"。)还有其他策略,我在“Seeding Multiple Processes”中对此进行了详细说明。

另见:

【讨论】:

  • 谢谢!有很多信息可以深入探讨这个主题。我不知道“基于计数器的”RNG 在我的场景中似乎是最有用的 RNG 类别。
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2021-11-06
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多