我会试一试,因为我对其他一些答案中的建议感到不安。
令是由两个RNG生成的无限位序列(不一定是一旦知道初始状态就可以确定的PRNG),我们正在考虑使用序列的可能性。,希望在某种意义上改善行为。与和相比,有很多不同的方式可以认为更好或更差;以下是一小部分,我认为是有意义,有用的,并且与“更好”和“更差”一词的正常用法保持一致:X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0)序列真正随机的概率增加或减少
- (1)可观察到的非随机性的概率会增加或减少(对于某些观察者,应用一定量的仔细检查,大概是这样)
- (2)可观察到的非随机性的严重性/明显性增加或减少。
首先让我们考虑(0),这是三个希望精确的希望中的唯一一个。注意,实际上,如果两个输入RNG中的任何一个确实是真正随机的,无偏倚的并且彼此独立,则XOR结果也将是真正的随机且无偏倚。考虑到这一点,请考虑以下情况:您认为是真正的随机无偏隔离比特流,但您不确定。如果是您错了的概率,则不是真正随机的概率为
,实际上要少得多,因为X⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εY假定非常接近0(“您认为它们是真正随机的”)。实际上,它甚至比这更好,我们还考虑了真正独立的可能性,即使它们都不是真正随机的:
因此,我们可以得出结论,在意义上(0),XOR不会造成伤害,并且可能会带来很大帮助。X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
但是,对于PRNG来说(0)并不有趣,因为在PRNG的情况下,所讨论的序列都没有任何真正随机的机会。
因此,对于这个实际上与PRNG有关的问题,我们必须谈论诸如(1)或(2)之类的问题。由于这些是根据诸如“可观察的”,“严重的”,“明显的”,“表观的”之类的性质和数量而言的,因此我们现在谈论的是Kolmogorov的复杂性,而我将不尝试使其精确。但是,我将做出无可争议的断言,即“ 01100110 ...”(期间= 4)比“ 01010101 ...”(期间= 2)比“ 00000000 ...”(恒定)。
现在,人们可能会猜测(1)和(2)将遵循与(0)相同的趋势,因此结论“ XOR不会伤害”可能仍然成立。但是,请注意,和都不是非随机的,但它们之间的相关性却导致显然是非随机的。当然,最严重的情况是(或)时,在这种情况下是常数,在所有可能的结果中是最差的;通常,很容易看出,无论和多么出色,X⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ 和必须“接近”独立,以使它们的xor不可观察非随机。实际上,可以将不可观测的依赖合理地定义为是不可观测的非随机。Y⃗ X⃗ ⊕Y⃗
事实证明,这种意外依赖是一个很大的问题。
出问题的一个例子
问题指出“我不排除几个线性反馈移位寄存器来自同一家族的共同示例”。但是我暂时将这种排除排除在外,以便给出一个非常简单的,真实的例子,说明XORing可能出错的事情。
我的示例将是大约在1983年的Unix版本上的rand()的旧实现。IIRC,rand()函数的这种实现具有以下属性:
- 每次调用rand()的值都是15个伪随机位,即范围为[0,32767)的整数。
- 连续的返回值交替奇偶校验;也就是说,最低有效位交替0-1-0-1 ...
- 最低有效位的下一个是周期4,第二高位的下一个是周期8,因此最高位是周期。215
- 因此,rand()的15位返回值的序列是周期性的,周期为。215
我一直无法找到原始源代码,但从https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A中的几篇文章拼凑在一起它确实执行了以下(C代码),这与我对上面属性的记忆一致:
#define RAND_MAX 32767
static unsigned int next = 1;
int rand(void)
{
next = next * 1103515245 + 12345;
return (next & RAND_MAX);
}
void srand(seed)
unsigned int seed;
{
next = seed;
}
可以想象,尝试以各种方式使用rand()会导致各种各样的失望。
例如,在某个时候,我尝试通过反复进行以下操作来模拟一系列随机硬币翻转:
rand() & 1
即最低有效位。结果是简单的交替-头-尾-头-尾。起初很难相信(必须是程序中的一个错误!),但是在我确信自己是对的之后,我尝试使用下一个最低有效位代替。如前所述,这并没有多大好处-该位是周期性的,周期为4。继续探索更高的位将揭示出我之前提到的模式:也就是说,每个下一个高阶位的周期是前一个周期的两倍,因此在所有这些中,最高位是最有用的。但是请注意,这里没有黑白阈值“ bit有用,bit没用”。我们真正能说的是带编号的比特位置具有不同程度的有用/无用。ii−1
我还尝试了诸如进一步加扰结果或将从对rand()的多次调用返回的值进行XOR运算之类的事情。对连续的rand()值对进行异或运算当然是灾难,它导致所有奇数!出于我的目的(即产生“明显随机”的抛硬币序列),异或的恒定奇偶校验结果甚至比原始的交替奇偶行为差。
稍作其放入原始框架中:即是rand()返回的具有给定种子的15位值的序列,而是来自另一个种子的序列。再次,将是全偶数或全奇数的序列,这比原始的交替偶数/奇数行为差。X⃗ sXY⃗ sYX⃗ ⊕Y⃗
换句话说,通过任何合理的解释,这就是XOR使(1)和(2)的情况恶化的示例。在其他几种方面,情况也更糟:
- (3)与XORed的最低有效位有明显的偏差,即0和1的频率不相等,这与两个输入中任何编号的位的位置都无偏的不同。
- (4)实际上,对于每个位位置,都有成对的种子在该XOR结果中有该位位置有偏差,对于每对种子,有(至少5个)位位置有在XOR中有偏差。结果。
- (5)XOR结果中整个15位值序列的周期为1或,而原始文件为。214215
(3),(4),(5)都不是显而易见的,但是它们都很容易验证。
最后,让我们考虑重新引入禁止来自同一家庭的PRNG。我认为这里的问题是,直到/除非有人开始使用XOR并注意到(或攻击者注意到)事情在(1)的意义上变得更糟,否则永远无法真正弄清两个PRNG是否来自“同一个家族”。 (2),即直到输出中的非随机模式越过阈值(从不被注意到注意到/尴尬/灾难)为止,这已经为时已晚。
我对这里的其他答案感到震惊,这些答案在理论方法的基础上给出了不合格的建议“ XOR不会伤害”,在我看来,在建模大多数人认为“好”和“坏”的工作上做得很差。现实生活中的PRNG。该建议与XOR使情况变得更糟的清晰明了的示例相矛盾,例如上面给出的rand()示例。尽管可以想象到,相对“强”的PRNG在与玩具rand()进行异或时,可以始终显示相反的行为,从而使它们成为一个好主意,但我没有看到在这个方向上的证据,无论是理论上的还是经验的,所以我认为这种情况似乎是不合理的。
就我个人而言,在我年轻时被XORing rand()所震惊,以及一生中无数其他各种各样的令人惊讶的关联,我几乎没有理由认为如果我再次尝试类似的策略,结果会有所不同。这就是为什么我本人不愿对多个PRNG进行异或运算,除非进行了非常广泛的分析和审核,以使我确信对于所涉及的特定RNG这样做可能是安全的。当我对一个或多个PRNG的信心不足时,作为一种潜在的解决方法,对它们进行异或运算不太可能增加我的信心,因此我不太可能将其用于此目的。我想您的问题的答案是,这是一种普遍持有的观点。