Random 重基PCG种子

Random 重基PCG种子,random,random-seed,Random,Random Seed,我正在研究一种算法(程序赛道生成器),在一般情况下,其结果完全基于RNG输出。但在某些特定场景中,我需要向用户提供绕过某些生成步骤(例如地形构造)的能力,而不会影响生成过程的其余部分 让我举一个简单的实际例子: ## Procedural racetrack ## * | Track shape generation | Terrain generation |

我正在研究一种算法(程序赛道生成器),在一般情况下,其结果完全基于RNG输出。但在某些特定场景中,我需要向用户提供绕过某些生成步骤(例如地形构造)的能力,而不会影响生成过程的其余部分

让我举一个简单的实际例子:

## Procedural racetrack ##
                                                         *
           | Track shape generation | Terrain generation | Surfaces generation | Assets picking |
RNG stream | 1 2 3                  | 4 5 6 7            | 8 9                 | 0              |
如您所见,在用户覆盖的赛道案例中,地形生成步骤被绕过(因此没有消耗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存储库问题部分中最初提交的问题:

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

然而,总的来说,你对种子的选择可能很重要,在实践中,如果不是在理论上

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

为了降低相关伪随机数的风险,您可以使用PRNG算法,例如SFC和其他所谓的“基于计数器的”PRNG(Salmon et al.,“并行随机数:简单到1、2、3”,2011),通过为每个种子提供其自己的独立伪随机数序列来支持独立的伪随机数“流”。(然而,请注意。)还有其他策略,我在“”中对此进行了详细解释

另见:


相关:不过,您的问题并非针对PCG;与另一个伪随机数生成器相比,PCG没有问题。事实上,使用另一个RNG(例如mt19937)也会有同样的问题。我之所以使用PCG,是因为我的种子(与赛道ID相对应)是
uint32\u t
数字,而且据我所知,PCG是一种RNG,如果使用32位数据进行种子,效果最好。谢谢!有很多信息可以深入探讨这个话题。我不知道“基于计数器”的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