我有一个循环,在其中增加了一些噪音。这些后来被用作某些统计检验的基础。

涉及的数据集非常大,因此我想使用openMP对其进行并行化以加快处理速度。当我想拥有多个PRNG时出现此问题。我有自己的基于NR模数方法的PRNG类(我认为是rand4),但是我不确定如何正确地植入PRNG以确保适当的熵

平常我会做这样的事情

prng.initTimer();

但是,如果我有一个prng数组,每个工作线程一个,则我不能简单地在每个实例上调用initTimer -计时器可能不会更改,并且计时器关闭可能会引入相关性。

我需要防止自然关联,而不是恶意攻击者(这是实验数据),因此我需要一种安全的方法来植入rng数组。

我想到了简单地使用
prng[0].initTimer()
for(int i=1; i<numRNGs; i++)
     prng[i].init(prng[0].getRandNum());

然后调用我的循环,但是不确定这是否会在模方​​法中引入相关性。

最佳答案

我认为这取决于您PRNG的属性。通常的PRNG的弱点是较低位的熵较低,而第一个n值的熵较低。因此,我认为您应该检查PRNG是否存在此类弱点,并相应地更改代码。

也许某些diehard tests提供了有用的信息,但是您也可以自己检查第一个n值及其统计属性,例如sum和variance,并将它们与期望值进行比较。

例如,对PRNG进行种子处理,然后对PRNG的前100个值进行模11求和,然后重复R次。如果总和与预期的差异非常大(5 * 100 * R),则您的PRNG会遇到上述一个或两个缺点。

对PRNG一无所知,使用这样的代码会更安全:

prng[0].initTimer();
// Throw the first 100 values away
for(int i=1; i < 100; i++)
   prng[0].getRandNum();
// Use only higher bits for seed values (assuming 32 bit size)
for(int i=1; i<numRNGs; i++)
   prng[i].init(((prng[0].getRandNum() >> 16) << 16)
               + (prng[0].getRandNum() >> 16));

但是,当然,这些是有关PRNG的推测。使用理想的PRNG,您的方法应该可以正常工作。

关于c++ - 熵和并行随机数发生器的种子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5765139/

10-12 18:03