Чому ми не поєднуємо генератори випадкових чисел?


60

Існує багато застосунків, де використовується генератор псевдовипадкових чисел. Тож люди реалізують те, що, на їхню думку, є чудовим лише для того, щоб згодом виявити його недоліки. Щось подібне сталося з генератором випадкових чисел Javascript нещодавно. RandU теж набагато раніше. Також є питання про невідповідний початковий посів на щось подібне до Twister.

Я не можу знайти приклади того, хто поєднує дві або більше сімейств генераторів зі звичайним оператором xor. Якщо для управління такими речами, як java.SecureRandom або Twister реалізація є достатньою потужністю, чому люди не поєднують їх? ISAAC xor XORShift xor RandU повинен бути досить хорошим прикладом, і там, де ви можете бачити слабкість одного генератора, що пом'якшується іншими. Це також повинно допомогти з розподілом чисел на більш високі розміри, оскільки внутрішні алгоритми абсолютно різні. Чи є якийсь фундаментальний принцип, який не слід поєднувати?

Якби ви створили справжній генератор випадкових чисел, люди, напевно, порадили б вам поєднати два чи більше джерел ентропії. Чи відрізняється мій приклад?

Я виключаю загальний приклад кількох лінійних регістрів зрушення зворотного зв'язку, які працюють разом, оскільки вони з однієї родини.


Відповідь може залежати від програми. Для чого ви хочете використовувати псевдовипадкову послідовність?
Yuval Filmus

1
Ви знайшли "Фортуну" ( en.wikipedia.org/wiki/Fortuna_%28PRNG%29 ), вона звучить як її близька до того, що ви описуєте, що вона об'єднує різні випадкові джерела в одне.
Маленький кодекс

1
@LittleCode Насправді це звучить зовсім інакше. Фортуна виводить дані з однієї хеш-функції. Він просто замислюється з безліччю слабких механізмів збирання ентропії до (повторного) перетискування, хоча це єдина функція виводу. Моє запитання, що стосується виведення з декількох функцій (чому б не 10 з них)? Якщо це пристрій заповнення, швидкість все одно не має значення.
Пол Ушак

1
Покійний Джордж Марсалья, відомий дослідник у галузі PRNG, який винайшов багато нових типів PRNG, таких як “multi-with-carry” та “xor-shift”, зробив саме це, коли запропонував генератор KISS у 1990-х, що є комбінацією трьох PRNG різного типу. Я успішно використовую KISS протягом останніх двадцяти років, звичайно, не для криптографії. Корисним вторинним джерелом стосовно KISS є цей документ Грега Роуза 2011 року, в якому він вказує на проблему з одним із складових PRNG, яка не визнає об'єднаною концепцію
njuffa

4
Кнут пов'язує результат наївного поєднання генераторів псевдовипадкових чисел (використовуючи одне випадкове число, щоб вибрати, який генератор використовувати), призвів до функції, яка сходиться до фіксованого значення! Отже, ще за часів перед революцією мікрокомп'ютера він попередив нас ніколи не змішувати випадкові генератори.
JDługosz

Відповіді:


7

IIRC (і це з пам’яті), бестселер Rand 1955 року «Мільйон випадкових цифр» зробив щось подібне. Перш ніж комп’ютери були дешевими, люди вибирали випадкові числа з цієї книги.

Автори генерували випадкові біти з електронним шумом, але це виявилося упередженим (важко зробити так, щоб фліпфлоп витратив рівно однакові рази на фліп та флоп). Однак комбінування бітів зробило розподіл набагато більш рівномірним.


45

Звичайно, ви можете комбінувати PRNG, як це, якщо хочете, припускаючи, що вони висіваються самостійно. Однак це буде повільніше і, мабуть, не вирішить найактуальніших проблем, які виникають у людей.

На практиці, якщо у вас є вимога до високоякісного PRNG, ви використовуєте добре перевірений криптографічний PRNG, і ви засіваєте його справжньою ентропією. Якщо ви це зробите, ваш найбільш ймовірний режим відмови не є проблемою з самим алгоритмом PRNG; найімовірнішим режимом відмови є відсутність адекватної ентропії (або, можливо, помилок впровадження). Xor-ing декількох PRNG не допомагає в цьому режимі відмови. Отже, якщо ви хочете дуже якісного PRNG, то, мабуть, мало сенсу їх розробляти.

Крім того, якщо ви хочете, щоб статистичний PRNG був достатньо хорошим для цілей моделювання, як правило, проблема №1 - це швидкість (генерувати псевдовипадкові числа дійсно швидко) або простота (не хочу витрачати багато часу на розробку чи дослідження). Xor-ing уповільнює PRNG та робить його складнішим, тому він також не відповідає первинним потребам у цьому контексті.

Поки ти проявляєш розумну турботу та компетентність, стандартні PRNG є більш ніж хорошими, тому насправді немає причини, чому нам потрібне щось фантазійніше (немає потреби в руслі). Якщо у вас немає навіть мінімальних рівнів догляду та компетенції, ви, мабуть, не збираєтесь вибирати щось складне, наприклад, xor-ing, і найкращий спосіб покращити речі - це зосередитись на більшій турботі та компетентності у виборі PRNG а не на ксьор.

Підсумок : В основному, трюк xor не вирішує проблем, які зазвичай є у людей під час використання PRNG.


3
"відсутність адекватної ентропії ... Збирання декількох PRNG не допомагає в цьому" - це дійсно може перешкоджати, оскільки ви збільшуєте кількість ентропії, необхідної для насіння ваших PRNG. Ось чому ви не хочете робити звичайною практикою поєднувати добре перевірені PRNG, навіть якщо це дійсно захищає вас від одного з тих добре перевірених PRNG, які виявляються повним сміттям (у застосуванні, яке ви використовуєте) .
Стів Джессоп

Ще одна причина полягає в тому, що помилки в реалізації набагато частіше зустрічаються, ніж основні проблеми з алгоритмами, тому чим простіше, тим краще. Стандартний алгоритм можна принаймні протестувати на інших значеннях реалізації або еталонних значень, а на замовлення xor не може.
Жиль

1
@DW Чому "висівали самостійно?" Оскільки моє питання стосується комбінацій різних сімейств генераторів, кожна сім'я повинна створити унікальну послідовність виведення з однакових насінин. Наприклад, java.SecureRandom і RC4 можна легко вивести з одного і того ж ключа, а потім об'єднати.
Пол Узак

1
@DW Велике припущення, яке ви стверджуєте, "використовуйте добре перевірений криптографічний PRNG". Реальність - це практично неможливо встановити, як і у більшості криптографічних шифрів, хешей тощо - слабкі сторони виявляються з часом. Вони були "добре перевірені" на знання вчорашніх або минулих років.
Шив

1
@PaulUszak, я не думаю, що я коли-небудь стверджував, що xor-ing двох генераторів робить його більш схильним до помилок. Я кажу, що якщо ви виберете хороший PRNG (лише один), одним з найбільш ймовірних режимів відмови є збій висіву насіння або збій у впровадженні, а два генератори не допомагають ні одному. (Зрозуміло, якщо один PRNG не виходить з ладу, також не корисні два генератори.) Отже, в основному це вирішення неправильної проблеми. Іншими словами, генератори генерації не значно підвищують впевненість, оскільки не стосуються найважливіших причин невизначеності.
DW

19

Насправді, щось проривне було тільки оголошено, роблячи саме це.

Професор інформатики Техаського університету Девід Цукерман та аспірант Ешан Чаттопадхей виявили, що "якісне" випадкове число може бути сформовано шляхом поєднання двох "низькоякісних" випадкових джерел.

Ось їхня робота: Явні екстрактори з двома джерелами та стійкі функції


8
Це суто теоретичний документ на іншу тему, який абсолютно не має практичної актуальності, незважаючи на PR-зусилля УТ.
Yuval Filmus

4
@Yuval Filmus - Ви б хотіли розширити цей коментар?
NietzscheanAI

8
Існує велика різниця між теорією та практикою. Зазвичай практикуючих не цікавить теорія, і навпаки. У цьому випадку PR-відділення UT вирішило скористатися чудовим теоретичним документом, описуючи це як практично актуальне, чого це не так. Проблеми, розглянуті в роботі, не такі цікаві з практичної точки зору, і вони мають прості рішення, які працюють досить добре, хоча неможливо довести, що вони роблять.
Yuval Filmus

2
Більше того, саме цей документ є лише однією роботою в теоретичній галузі витяжок. Ви можете виписати будь-який інший папір у цьому районі таким же чином. Всі вони полягають у поєднанні слабких джерел для створення сильного джерела. Різниця полягає лише в параметрах.
Yuval Filmus

3
Нарешті, будівництво на папері - це, мабуть, надмірність, а не те, що ви коли-небудь хотіли б застосувати. Конкретні параметри для цього типу конструкції важко визначити, і вони, як правило, вкрай погані, оскільки документи завжди зосереджені на асимптотичному режимі та ігнорують константи.
Yuval Filmus

9

X1,,XnXi{0,1}X1,,XnKf(K)

X1,,Xn(X1,,Xn)LL()

  • y1,,ynL(X1y1,,Xnyn)=L(X1,,Xn)

  • X0,X1T{0,1}Z=XTL(Z)min(X0,X1)

Перша властивість означає, що міра інваріантна під час перегортання го біта. Друга властивість означає, що якщо ми змішуємо два розподіли , то результат принаймні такий же хороший, як і гірший.iX,Y

Будь-яка розумна міра випадковості задовольнить першу властивість. Друга властивість задовольняється найбільш популярними заходами, такими як ентропія та min-ентропія .HH

Тепер ми можемо заявити і довести теорему, що показує, що XORing двох псевдовипадкових послідовностей завжди є хорошою ідеєю.

Теорема. Нехай - дві незалежні псевдовипадкові послідовності однакової довжини, і - допустима міра випадковості (одна, що задовольняє двом вище умовам). ТодіX,YL

L(XY)max(L(X),L(Y)).

Доказ. Припустимо, . Тоді являє собою суміш з розподілу , змішують в відповідно до розподілу . Оскільки і суміш принаймні так само хороша, як і найгірший розподіл, що змішується, ми отримуємо . L(X)L(Y)XYXyYL(Xy)=L(X)L(XY)L(X) 

Що ця теорема означає, що якщо ви XOR двома псевдовипадковими послідовностями, згенерованими за допомогою двох незалежних ключів, результат завжди принаймні такий же хороший, як і краща послідовність, що є XORed, стосовно будь-якого допустимого показника випадковості.

На практиці, для використання двох незалежних клавіш, ми, мабуть, розширюємо одну клавішу на дві клавіші псевдовипадково. Два клавіші тоді не є незалежними. Однак, якщо ми використовуємо «дорогий» спосіб розширення однієї клавіші на дві клавіші, ми очікуємо, що отримані дві клавіші «виглядають» незалежними, і тому теорема буде «морально». У теоретичній криптографії є ​​способи уточнення цього твердження.


Чи повинні ми тоді XOR два генератори псевдовипадкових чисел? Якщо нас не обмежує швидкість, то це, безумовно, хороша ідея. Але на практиці у нас обмеження швидкості. Тоді ми можемо задати наступне питання. Припустимо, що нам дано два PRNG, кожен з параметром який керує часом роботи (і так силою) генератора. Наприклад, може бути довжиною LFSR або кількістю раундів. Припустимо, ми використовуємо один PRNG з параметром , інший з параметром та XOR результатом. Можна вважати, що , так що загальний час роботи є постійним. Який найкращий вибірTTT1T2T1+T2=tT1,T2? Тут є компроміс, на який взагалі важко відповісти. Можливо, налаштування набагато гірше, ніж будь-яке або .(t/2,t/2)(t,0)(0,t)

Найкраща порада тут - дотримуватися популярного PRNG, який вважається сильним. Якщо ви можете зекономити більше часу для створення послідовності, XOR кілька копій, використовуючи незалежні клавіші (або ключі, створені розширенням одного ключа за допомогою дорогого PRNG).


Коментарі не для розширеного обговорення; ця розмова переміщена до чату . Після того, як ви досягнете конструктивного кінця, відредагуйте відповідь, щоб включити результати вашої дискусії.
Рафаель

4

Я спробую це зробити, оскільки мене достатньо турбують поради, наведені в деяких інших відповідях.

Нехай є нескінченними бітовими послідовностями, породженими двома RNG (не обов'язково PRNG, які детерміновані, коли буде відомий початковий стан), і ми розглядаємо можливість використання послідовності з надією покращити поведінку в якомусь сенсі. Існує багато різних способів, за допомогою яких можна вважати кращими чи гіршими порівняно з кожним із та ; ось невеличка жменька, яка, на мою думку, є змістовною, корисною та відповідає звичайному використанню слів «краще» та «гірше»:X,YXYXYXY

  • (0) Ймовірність справжньої випадковості послідовності збільшується або зменшується
  • (1) Вірогідність спостережуваної невипадковості збільшується або зменшується (стосовно певного спостерігача, який застосовує певну кількість перевірок, імовірно)
  • (2) Суворість / очевидність спостережуваної невипадковості збільшується або зменшується.

Спочатку давайте подумаємо про (0), який є єдиним із трьох, хто сподівається на точність. Зауважте, що якщо насправді будь-який з двох вхідних RNG дійсно є дійсно випадковим, неупередженим та незалежним від інших, то результат XOR буде справді випадковим і неупередженим. Зважаючи на це, розглянемо випадок, коли ви вважаєте, що є справді випадковими неупередженими ізольованими бітовими потоками, але ви не зовсім впевнені. Якщо - відповідні ймовірності, що ви помиляєтесь щодо кожного з них, то ймовірність того, що не є справді випадковою, тоді , насправді набагато менше, оскількиX,YεX,εYXYεXεY<min{εX,εY}εX,εY вважаються дуже близькими до 0 ("ти вважаєш їх справді випадковими"). Насправді це навіть краще, ніж це, коли ми також враховуємо можливість бути по-справжньому незалежним, навіть коли жодне не є справді випадковим: Тому ми можемо зробити висновок, що XOR у сенсі (0) не може нашкодити, і може потенційно багато допомогти.X,Y

Pr(XY 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 не зашкодить" все ж може бути справедливим. Однак зауважимо значну можливість того, що ні ні не були випадково невипадковими, але кореляції між ними призводять до того, що може бути випадково невипадковим. Найважчий випадок цього, звичайно, це коли (або ), у цьому випадку постійна, найгірший з усіх можливих результатів; загалом, легко помітити, що незалежно від того, наскільки хороші та ,XYXYX=YX=not(Y)XYXYXі повинні бути "близькими" до незалежних, щоб їх xor був не помітно-не випадковим. Насправді, не будучи помітними залежними, можна обґрунтовано визначити як , не будучи помітно-не випадковими.YXY

Така залежність від несподіванок виявляється справді великою проблемою.


Приклад того, що йде не так

Питання зазначає: "Я виключаю загальний приклад декількох регістрів зсуву лінійних зворотних зв'язків, які працюють разом, оскільки вони з однієї родини". Але я зараз виключаю це виключення, щоб навести дуже простий чіткий чіткий приклад з реального життя, що може піти не так з 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. Продовжуючи досліджувати послідовно більш високі біти виявив шаблон, який я зазначив раніше: тобто кожен наступний біт вищого порядку мав вдвічі більше періоду попереднього, так що в в цьому відношенні біт вищого порядку був найкориснішим з усіх. Зауважте, що тут не було чорно-білого порогу "біт корисний, біт не корисний"; Все, що ми можемо сказати, - нумеровані бітові позиції мали різну ступінь корисності / непотрібності.ii1

Я також спробував такі речі, як скремблювання результатів далі, або значення XORing разом, повернені з декількох викликів на rand (). Звичайно, пара XORing пар послідовних значень rand () була катастрофою - це призвело до всіх непарних чисел! Для моїх цілей (а саме створення «очевидно випадкової» послідовності монетних перегородок) результат XOR з постійним паритетом був навіть гіршим, ніж чергування непарної поведінки оригіналу.

Незначна зміна ставить це в початковий фреймворк: тобто нехай є послідовністю 15-бітових значень, повернутих rand () з заданим насінням , і послідовністю з іншого насіння . Знову ж таки, буде послідовністю або парних чи непарних чисел, що гірше, ніж оригінальне чергування парного / непарного поведінки.XsXYsYXY

Іншими словами, це приклад, коли 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 їх навряд чи збільшить мою впевненість, тому я навряд чи буду використовувати його для такої мети. Я думаю, що відповідь на ваше запитання полягає в тому, що це широко розповсюджені настрої.


Тож як ви можете пояснити використання A5 / 1 буквально мільярдами людей?
Пол Узак

@PaulUszak Я поняття не маю. Чи протиріччя A5 / 1, яке використовуються мільярдами людей, суперечить тому, що я сказав?
Дон Хетч

Це три прнги (насправді з однієї родини) об'єднані разом, щоб утворити кращий на шляху, який вас заважає і тривожить ...
Пол Ушак

Що мене турбує і насторожує - це некваліфікована порада, "якщо ви не впевнені, продовжуйте і XOR разом купою RNG; це не може погіршити ситуацію". Я не хотів сказати або мати на увазі, що XOR поганий у всіх випадках, і я взагалі не маю жодної думки щодо A5 / 1 або використання XOR в ньому. Чи допоможе це, якщо я зміню своє остаточне дурне резюме, щоб зробити це зрозумілішим?
Дон Хетч

1
У кінцевому підсумку я замінив спрощене "просто скажи ні" XORing RNGs "чимось більш реальним і, сподіваюся, менш оманливим.
Дон Хетч

0

ВІДПОВІДАЛЬНІСТЬ: Ця відповідь суворо стосується "Ми це не робимо", а не "ось математичний доказ того, чому він може чи не може працювати". Я не стверджую, що XOR вводить (або ні) криптографічні вразливості. Моя думка лише в тому, що досвід показує нам, що навіть найпростіші схеми майже завжди призводять до непередбачених наслідків - і саме тому ми їх уникаємо.

"Випадковість" - це лише верхівка айсберга, коли мова йде про RNG та PRNG. Є інші важливі якості, наприклад, рівномірність.

Уявіть собі звичайну кістку, яка сама по собі хороша RNG. Але тепер скажімо, що вам потрібен діапазон 1-5 замість 1-6. Перше, що спадає на думку, - це просто стерти 6 облич і замінити його додатковим 1. "Випадковість" залишається (результати все ще справді випадкові), проте однаковість сильно страждає: зараз 1 вдвічі більше, ніж інші результати.

Об'єднання результатів з декількох РНГ - це так само слизький схил. Напр. просте додавання 2-х метальних кісток повністю знищує будь-яку рівномірність, оскільки "7" зараз у 6 разів частіше, ніж "2" або "12". Я погоджуюся, що XOR виглядає краще, ніж додавання на перший погляд, але в PRNG нічого не виходить так, як виглядає на перший погляд.

Ось чому ми прагнемо дотримуватися відомих реалізацій - адже хтось витрачав багато часу і грошей на їх дослідження, а всі недоліки добре відомі, зрозумілі та їх можна подолати. Коли ви розгортаєте свою власну, ви потенційно створюєте вразливості, і вам слід докласти подібних зусиль, щоб довести це. Як показує приклад додавання кісток, комбінування може не сильно відрізнятися від створення нового з нуля.

Безпека - це ланцюжок, настільки сильний, як і його найслабший компонент. Основне правило безпеки: коли ви поєднуєте 2 речі, зазвичай отримуєте суму недоліків, а не суму сильних сторін.


7
Категорично не згоден. Якщо ви XOR справді випадкова послідовність з довільною послідовністю, ви все одно отримаєте справді випадкову послідовність. Аналогічно, якщо ви XOR двома незалежними псевдовипадковими послідовностями (тобто, згенерованими різними ключами), ви отримуєте щось принаймні таке сильне, як кожне окремо.
Yuval Filmus

3
Мені це здається неправильним. Звичайний випадок тут полягає в тому, що я думаю, що у мене є два дуже якісні РНГ, які створюють по суті справді випадкові біти, але є невеликий шанс епсилону, що я можу (можливо, грубо) помилитися з приводу одного (або, що набагато рідше, обох). Якщо я збираю їх разом, якщо я маю рацію щодо хоча б одного з них, результат буде справді випадковим, і я хороший. Таким чином, комбінуючи їх, я знизив шанси отримати поганий RNG з приблизно epsilon / 2 до надзвичайно крихітного epsilon ^ 2, що, безумовно, виграш. Я підозрюю, що подібна динаміка дотримується навіть у менш реальних випадках.
Дон Хетч

2
Я досі не переконаний. Коли я писав "справді випадково", я мав на увазі "рівномірно випадковий". Якщо ви XOR рівномірно випадкової послідовності з довільною послідовністю, ви отримаєте рівномірно випадкову послідовність.
Yuval Filmus

2
@DonHatch Безумовно, це було б право. Скажімо, ваш PRNG генерує послідовність довжиною 100, потім шумну версію тієї ж послідовності тощо. Припустимо, побітове співвідношення другого примірника з першим є . Послідовність задовольняє . Оскільки, справедливо сказати, що співвідношення не були "сильно збільшеними", а досить грубо зменшеними. Pr[Xi+100=Xi]=(1+ϵ)/2Zi=XiYiPr[Zi+100=Zi]=(1+ϵ2)/2ϵ2|ϵ|
Yuval Filmus

3
@YuvalFilmus Ви, мабуть, вірні, що співвідношення між пунктом i та i + 100 сильно зменшилось, але це не в цьому. Надзвичайно конкретний і реальний приклад: я пам’ятаю, що у старій хитромудрій реалізації rand () на unix була періодична поведінка в біті нижнього порядку кожного поверненого 31-бітного цілого числа, чого більшість людей не помічали. Отримайте цю послідовність вкладишів зі зміщеною копією себе (що ви отримуєте, коли використовуєте інше насіння) невдалого розміру зсуву, ви отримаєте всі парні числа. Це набагато гірше, ніж проблема в початковій послідовності, для більшості цілей.
Дон Хетч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.