Я дам этому шанс, так как я достаточно обеспокоен советом, данным в некоторых других ответах.
Пусть - бесконечные битовые последовательности, сгенерированные двумя RNG (не обязательно PRNG, которые являются детерминированными после того, как известно начальное состояние), и мы рассматриваем возможность использования последовательности → X ⊕ → Y с надеждой на улучшение поведения в каком-то смысле. Есть много разных способов, которыми → X ⊕ → Y можно считать лучше или хуже по сравнению с каждым из → X и → Y ; Вот небольшая горстка, которая, я считаю, имеет смысл, полезна и согласуется с обычным употреблением слов «лучше» и «хуже»:Икс⃗ , Y⃗ Икс⃗ ⊕ Y⃗ Икс⃗ ⊕ Y⃗ Икс⃗ Y⃗
- (0) Вероятность истинной случайности последовательности увеличивается или уменьшается
- (1) Вероятность наблюдаемой неслучайности увеличивается или уменьшается (по отношению к некоторому наблюдателю, применяющему определенное количество проверки, предположительно)
- (2) Степень / очевидность наблюдаемой неслучайности увеличивается или уменьшается.
Икс⃗ , Y⃗ εИкс, εYИкс⃗ ⊕ Y⃗ ≤ εИксεY< М я n { εИкс, εY}εИкс, εYИкс⃗ , Y⃗
пг ( х⃗ ⊕ Y⃗ п о т т т у л у г а н д уплотнительных м )≤мин{пг ( х⃗ п о т т т у л у г а н д уплотнительных м ),пr ( Y⃗ п о т т т у л у г а н д уплотнительных м ),пг ( х⃗ , Y⃗ д е п е н д е н т )}.
Поэтому мы можем заключить, что в смысле (0) XOR не может причинить вреда и потенциально может сильно помочь.
Однако (0) не представляет интереса для PRNG, поскольку в случае PRNG ни одна из рассматриваемых последовательностей не имеет шансов быть действительно случайной.
Поэтому для этого вопроса, который на самом деле касается PRNG, мы должны говорить о чем-то вроде (1) или (2). Так как они с точки зрения свойств и величин, таких как «наблюдаемый», «серьезный», «очевидный», «очевидный», мы сейчас говорим о колмогоровской сложности, и я не буду пытаться уточнить это. Но я пойду настолько далеко, что сделаю, надеюсь, неоспоримое утверждение, что с помощью такой меры «01100110 ...» (период = 4) хуже, чем «01010101 ...» (период = 2), что хуже, чем « 00000000 ... "(постоянный).
Икс⃗ Y⃗ Икс⃗ ⊕ Y⃗ Икс⃗ = Y⃗ Икс⃗ = П о т ( У⃗ )Икс⃗ ⊕ Y⃗ Икс⃗ Y⃗ Икс⃗ Y⃗ Икс⃗ ⊕ Y⃗
Такая неожиданная зависимость оказывается действительно большой проблемой.
Пример того, что идет не так
Вопрос гласит: «Я исключаю общий пример нескольких регистров сдвига с линейной обратной связью, работающих вместе, поскольку они принадлежат к одному семейству». Но я собираюсь на время исключить это исключение, чтобы привести очень простой и понятный пример из жизни, который может пойти не так с XORing.
Моим примером будет старая реализация rand (), которая была в какой-то версии Unix около 1983 года. IIRC, эта реализация функции rand () имела следующие свойства:
- значение каждого вызова rand () составляло 15 псевдослучайных битов, то есть целое число в диапазоне [0, 32767).
- последовательные возвращаемые значения чередуются четно-нечетно-четно-нечетно; то есть младший значащий бит чередуется 0-1-0-1 ...
- 215
- поэтому последовательность 15-битных возвращаемых значений rand () была периодической с периодом 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
яя - 1 «бесполезно» здесь; все, что мы действительно можем сказать, это то, что пронумерованные позиции битов были различной степени полезности / бесполезности.
Я также пробовал такие вещи, как дальнейшее скремблирование результатов или объединение значений XOR, возвращаемых из нескольких вызовов rand (). Конечно, XOR для пар последовательных значений rand () был катастрофой - он приводил ко всем нечетным числам! Для моих целей (а именно, для создания «очевидно случайной» последовательности бросков монет) результат XOR с постоянной четностью был даже хуже, чем чередующееся четно-нечетное поведение оригинала.
Икс⃗ sИксY⃗ sYИкс⃗ ⊕ Y⃗ будет последовательностью либо всех четных, либо полностью нечетных чисел, что хуже, чем исходное чередующееся четное / нечетное поведение.
Другими словами, это пример, когда XOR ухудшил ситуацию в смысле (1) и (2), с помощью любой разумной интерпретации. Хуже и в нескольких других отношениях:
- (3) младший значащий бит XOR явно смещен, то есть имеет неравные частоты 0 и 1, в отличие от нумерованного положения бита на любом из входов, которые все несмещены.
- (4) На самом деле, для каждой позиции бита есть пары начальных чисел, для которых эта позиция бита смещена в результате XOR, и для каждой пары начальных чисел существуют (по крайней мере 5) позиции битов, которые смещены в XOR результат.
- 214215 для оригиналов.
Ни одно из (3), (4), (5) не является очевидным, но все они легко проверяемы.
Наконец, давайте рассмотрим повторное введение запрета на PRNG из одной семьи. Проблема здесь, я думаю, заключается в том, что никогда не ясно, являются ли два PRNG «одного и того же семейства», до тех пор, пока / если кто-то не начнет использовать XOR и не заметит (или не заметит злоумышленник), что вещи стали хуже в смысле (1) и (2), то есть до тех пор, пока неслучайные паттерны в выходных данных пересекают порог от незамеченного к заметному / смущающему / катастрофическому, и в этот момент уже слишком поздно.
Я встревожен другими ответами здесь, которые дают безоговорочный совет «XOR не может навредить» на основе теоретических мер, которые, как мне кажется, плохо справляются с моделированием того, что большинство людей считают «хорошим» и «плохим» в отношении PRNGs в реальной жизни. Этот совет противоречит ясным и вопиющим примерам, в которых XOR ухудшает ситуацию, например, приведенному выше примеру rand (). Хотя вполне возможно, что относительно «сильные» PRNG могли последовательно отображать противоположное поведение, когда XORed к поведению игрушечного PRNG, который был rand (), тем самым делая XOR хорошей идеей для них, я не видел никаких доказательств в этом направлении, теоретических или эмпирически, поэтому мне кажется необоснованным предполагать, что это происходит.
Лично, будучи застигнутым врасплох XORing rand () в моей юности и бесчисленными другими неожиданными корреляциями в течение всей моей жизни, у меня нет особых оснований полагать, что результат будет другим, если я попробую подобную тактику снова. Вот почему я лично очень неохотно делаю XOR вместе с несколькими PRNG, если только не был проведен очень тщательный анализ и проверка, чтобы дать мне некоторую уверенность в том, что это может быть безопасно сделать для конкретных рассматриваемых RNG. Как потенциальное лекарство от того, когда у меня низкая уверенность в одном или нескольких отдельных PRNG, их XOR вряд ли увеличит мою уверенность, поэтому я вряд ли буду использовать его для этой цели. Я полагаю, что ответ на ваш вопрос заключается в том, что это широко распространенное мнение.