Я спробую це зробити, оскільки мене достатньо турбують поради, наведені в деяких інших відповідях.
Нехай є нескінченними бітовими послідовностями, породженими двома 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 ("ти вважаєш їх справді випадковими"). Насправді це навіть краще, ніж це, коли ми також враховуємо можливість бути по-справжньому незалежним, навіть коли жодне не є справді випадковим:
Тому ми можемо зробити висновок, що XOR у сенсі (0) не може нашкодити, і може потенційно багато допомогти.X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
Однак (0) не цікавий для PRNG, оскільки у випадку з PRNG жодна із зазначених послідовностей не має шансів бути справді випадковими.
Тому для цього питання, яке насправді стосується PRNG, ми повинні говорити про щось на зразок (1) або (2). Оскільки це в таких властивостях і кількостях, як "спостережуване", "важке", "очевидне", "очевидне", ми зараз говоримо про складність Колмогорова, і я не збираюся намагатися зробити це точно. Але я піду так далеко, щоб висловити сподіваюсь суперечливе твердження, що за такою мірою "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.
Мій приклад - це стара реалізація rand (), яка була в якійсь версії Unix, приблизно в 1983 році. IIRC, ця реалізація функції rand () мала такі властивості:
- значення кожного виклику rand () становило 15 псевдовипадкових біт, тобто ціле число в діапазоні [0, 32767).
- послідовні повернені значення чергуються з непарними, непарними або непарними; тобто найменш значущі біти чергували 0-1-0-1 ...
- наступний до найменш значущого біта мав період 4, наступний після цього мав період 8, ... тому біт вищого порядку мав період .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
тобто найменш значущий біт. Результатом стало просте чергування головки-хвости-голови-хвости. Спершу було важко повірити (має бути помилка в моїй програмі!), Але після того, як я переконав себе, що це правда, я спробував використати наступний найменш значущий біт. Це не набагато краще, як зазначалося раніше - цей біт періодичний з періодом 4. Продовжуючи досліджувати послідовно більш високі біти виявив шаблон, який я зазначив раніше: тобто кожен наступний біт вищого порядку мав вдвічі більше періоду попереднього, так що в в цьому відношенні біт вищого порядку був найкориснішим з усіх. Зауважте, що тут не було чорно-білого порогу "біт корисний, біт не корисний"; Все, що ми можемо сказати, - нумеровані бітові позиції мали різну ступінь корисності / непотрібності.ii−1
Я також спробував такі речі, як скремблювання результатів далі, або значення XORing разом, повернені з декількох викликів на rand (). Звичайно, пара XORing пар послідовних значень rand () була катастрофою - це призвело до всіх непарних чисел! Для моїх цілей (а саме створення «очевидно випадкової» послідовності монетних перегородок) результат XOR з постійним паритетом був навіть гіршим, ніж чергування непарної поведінки оригіналу.
Незначна зміна ставить це в початковий фреймворк: тобто нехай є послідовністю 15-бітових значень, повернутих rand () з заданим насінням , і послідовністю з іншого насіння . Знову ж таки, буде послідовністю або парних чи непарних чисел, що гірше, ніж оригінальне чергування парного / непарного поведінки.X⃗ sXY⃗ sYX⃗ ⊕Y⃗
Іншими словами, це приклад, коли XOR погіршив речі у розумінні (1) та (2), будь-якою розумною інтерпретацією. Гірше також у кількох інших способах:
- (3) Найменш значущий біт XORed очевидно упереджений, тобто має неоднакові частоти 0 і 1, на відміну від будь-якого нумерованого бітового положення в будь-якому з входів, які є неупередженими.
- (4) Насправді, для кожної бітової позиції є пари насінин, для яких це положення біту є упередженим у результаті XOR, а для кожної пари насінь є (принаймні 5) бітові позиції, які зміщені в XOR результат.
- (5) Період всієї послідовності 15-бітних значень у результаті XOR становить або 1, або , порівняно з для оригіналів.214215
Жоден з (3), (4), (5) очевидний, але всі вони легко перевірити.
Нарешті, розглянемо можливість повторного введення заборони PRNG з однієї родини. Проблема тут, я думаю, полягає в тому, що ніколи не зрозуміло, чи є два PRNG "з однієї сім'ї", поки / якщо хтось не почне використовувати XOR і не помітить (або зловмисник) речі погіршилися в сенсі (1) та (2), тобто до тих пір, поки невипадкові шаблони у виході не перейдуть поріг від непоміченого до поміченого / бентежного / катастрофічного, і в цей момент вже пізно.
Мене насторожують інші відповіді, які дають некваліфіковану пораду "XOR не може нашкодити" на основі теоретичних заходів, які, як мені здається, роблять погану роботу з моделювання того, що більшість людей вважає "хорошим" і "поганим" PRNG в реальному житті. Цій раді суперечать чіткі і кричущі приклади, в яких XOR робить гірше, наприклад, наведений вище приклад rand (). Хоча можливо, що відносно "сильні" PRNG можуть послідовно демонструвати протилежну поведінку, коли XORed до поведінки іграшкового PRNG, який був rand (), завдяки чому XOR є гарною ідеєю для них, я не бачив доказів у цьому напрямку, теоретичних чи емпіричні, тому мені здається нерозумним припускати, що це відбувається.
Особисто мене, покусавши сюрпризом у юності XORing rand (), і незліченною безліччю різноманітних кореляцій сюрпризів протягом усього життя, у мене мало підстав думати, що результат буде іншим, якщо я спробую знову подібну тактику. Ось чому я особисто був би дуже неохоче на XOR разом декілька PRNG, якщо не було зроблено дуже широкого аналізу та перевірки, щоб дати мені певну впевненість, що це може бути безпечно для конкретних RNG. Як потенційне лікування, коли я маю низьку довіру до одного або декількох окремих PRNG, XORing їх навряд чи збільшить мою впевненість, тому я навряд чи буду використовувати його для такої мети. Я думаю, що відповідь на ваше запитання полягає в тому, що це широко розповсюджені настрої.