ฉันจะให้ช็อตนี้เนื่องจากฉันถูกรบกวนโดยคำแนะนำที่ให้ไว้ในคำตอบอื่น ๆ
ให้เป็นลำดับบิตแบบไม่สิ้นสุดที่สร้างโดย RNG สองตัว (ไม่จำเป็นต้องมี PRNG ซึ่งกำหนดล่วงหน้าเมื่อทราบสถานะเริ่มต้น) และเรากำลังพิจารณาความเป็นไปได้ในการใช้ลำดับด้วยความหวังว่าจะปรับปรุงพฤติกรรมในบางแง่มุม มีวิธีการมากมายที่อาจจะดีกว่าหรือแย่กว่าเมื่อเทียบกับแต่ละและ ; นี่เป็นเพียงเล็กน้อยที่ฉันเชื่อว่ามีความหมายมีประโยชน์และสอดคล้องกับการใช้คำปกติ "ดีกว่า" และ "แย่ลง":X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0) ความน่าจะเป็นของการสุ่มที่แท้จริงของลำดับนั้นเพิ่มขึ้นหรือลดลง
- (1) ความน่าจะเป็นที่เพิ่มขึ้นหรือลดลงที่ไม่สามารถสังเกตได้ที่สังเกตได้ (สำหรับผู้สังเกตการณ์บางคนที่ใช้การตรวจสอบจำนวนหนึ่งตามที่คาดการณ์)
- (2) ความรุนแรง / ความชัดเจนของการเพิ่มหรือลดที่ไม่สามารถสังเกตได้ที่สังเกตได้
ก่อนอื่นลองคิดถึง (0) ซึ่งเป็นเพียงหนึ่งในสามที่มีความหวังว่าจะแม่นยำ โปรดสังเกตว่าหากในความเป็นจริงทั้งสองอินพุต RNGs นั้นเป็นแบบสุ่มไม่ฝักใฝ่ฝ่ายใดและเป็นอิสระจากอีกฝ่ายหนึ่งผลลัพธ์ 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)}.
อย่างไรก็ตาม (0) ไม่น่าสนใจสำหรับ PRNG เนื่องจากในกรณีของ PRNGs ไม่มีลำดับใด ๆ ที่เป็นปัญหามีโอกาสที่จะสุ่มอย่างแท้จริง
ดังนั้นสำหรับคำถามนี้ซึ่งจริง ๆ แล้วเกี่ยวกับ PRNG เราต้องพูดถึงบางอย่างเช่น (1) หรือ (2) เนื่องจากสิ่งเหล่านี้มีคุณสมบัติและปริมาณเช่น "ที่สังเกตได้", "รุนแรง", "ชัดเจน", "ชัดเจน" ตอนนี้เรากำลังพูดถึงความซับซ้อนของ Kolmogorov และฉันจะไม่พยายามทำให้แม่นยำ แต่ฉันจะไปไกลเท่าที่จะทำให้การยืนยันที่ไม่มีข้อโต้แย้งอย่างหวังว่าโดยมาตรการดังกล่าว "01100110 ... " (จุด = 4) แย่กว่า "01010101 ... " (จุด = 2) ซึ่งแย่กว่า " 00000000 ... "(คงที่)
ทีนี้ใคร ๆ ก็เดาได้ว่า (1) และ (2) จะเป็นไปตามแนวโน้มเช่นเดียวกับ (0) และดังนั้นข้อสรุป "XOR ไม่สามารถทำร้าย" อาจยังคงมีอยู่ อย่างไรก็ตามโปรดสังเกตความเป็นไปได้ที่สำคัญว่าหรือไม่ได้สังเกตแบบสุ่ม แต่ความสัมพันธ์ระหว่างพวกเขาทำให้ไม่สุ่ม แน่นอนที่สุดกรณีนี้คือเมื่อ (หรือซึ่งในกรณีนี้เป็นค่าคงที่ที่เลวร้ายที่สุดของผลลัพธ์ที่เป็นไปได้ทั้งหมด โดยทั่วไปแล้วจะเห็นได้ง่ายไม่ว่าและจะดีแค่ไหน→ Y → X ⊕ → Y → X = → Y → X =not( → Y ) → X ⊕ → Y → X → Y → X → Y → X → Y → X ⊕ → YX⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ และจำเป็นต้อง "ปิด" เป็นอิสระเพื่อให้แฮคเกอร์ไม่สังเกตได้ ในความเป็นจริงการไม่ขึ้นอยู่กับการสังเกตได้สามารถกำหนดได้อย่างสมเหตุสมผลว่าการไม่อยู่ในรูปแบบสุ่มY⃗ X⃗ ⊕Y⃗
การพึ่งพาความประหลาดใจดังกล่าวกลายเป็นปัญหาใหญ่จริงๆ
ตัวอย่างของสิ่งที่ผิดพลาด
คำถามระบุว่า "ฉันไม่รวมตัวอย่างทั่วไปของการเลื่อนการตอบรับเชิงเส้นหลายครั้งที่ทำงานร่วมกันเนื่องจากพวกเขามาจากครอบครัวเดียวกัน" แต่ฉันจะไม่รวมการกีดกันนั้นในขณะนั้นเพื่อให้ตัวอย่างชีวิตจริงที่เรียบง่ายชัดเจนของสิ่งที่สามารถผิดพลาดกับ XORing
ตัวอย่างของฉันจะเป็นการใช้งานแบบเก่าของ rand () ซึ่งอยู่บน Unix บางรุ่นประมาณปี 1983 IIRC การใช้งาน rand () นี้มีคุณสมบัติดังต่อไปนี้:
- ค่าของแต่ละการเรียกไปยัง rand () คือ 15 บิตสุ่มหลอกซึ่งก็คือจำนวนเต็มในช่วง [0, 32767)
- ค่าตอบแทนต่อเนื่องสลับคู่คี่ - คู่ - คี่; นั่นคือบิตที่มีนัยสำคัญน้อยที่สุดสลับ 0-1-0-1 ...
- บิตถัดไปไปน้อยอย่างมีนัยสำคัญมีระยะเวลา 4 หลังจากที่ถัดไปที่มีระยะเวลา 8 ... ดังนั้นบิตสูงสุดสั่งมีระยะเวลา{15}215
- ดังนั้นลำดับของค่าผลตอบแทน 15 บิตของแรนด์ () เป็นระยะที่มีระยะเวลา{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() & 1
คือบิตที่สำคัญน้อยที่สุด ผลที่ได้คือการสับเปลี่ยนหัวอย่างง่าย - หาง - หัว - หาง - นั่นเป็นเรื่องยากที่จะเชื่อในตอนแรก (ต้องเป็นข้อบกพร่องในโปรแกรมของฉัน!) แต่หลังจากที่ฉันเชื่อมั่นในตัวเองมันเป็นเรื่องจริงฉันพยายามใช้บิตถัดไปที่สำคัญน้อยที่สุดแทน นั่นไม่ได้ดีไปกว่านี้เท่าที่สังเกตไว้ก่อนหน้านี้ - บิตนั้นเป็นงวดตามช่วงเวลา 4 ต่อเนื่องในการสำรวจบิตที่สูงขึ้นอย่างต่อเนื่องเผยให้เห็นรูปแบบที่ฉันระบุไว้ก่อนหน้านี้: นั่นคือบิตลำดับสูงกว่าถัดไป การเคารพลำดับสูงสุดนี้เป็นประโยชน์สูงสุดของพวกเขาทั้งหมด อย่างไรก็ตามโปรดทราบว่าไม่มีขีด จำกัด ขาวดำ "บิตมีประโยชน์บิตไม่มีประโยชน์" ที่นี่; ทั้งหมดที่เราสามารถพูดได้ก็คือตำแหน่งบิตที่มีตัวเลขมีระดับของประโยชน์ / ความไร้ประโยชน์ที่แตกต่างกันฉัน- 1ii−1
ฉันยังลองสิ่งต่าง ๆ เช่นการตรวจสอบผลลัพธ์เพิ่มเติมหรือ XORing ค่าที่ส่งคืนจากการโทรหลายครั้งไปยัง rand () คู่ของค่าแรนด์ต่อเนื่อง () คู่กันเป็นหายนะแน่นอน - มันส่งผลให้ตัวเลขคี่ทั้งหมด! สำหรับจุดประสงค์ของฉัน (กล่าวคือการสร้างลำดับการพลิกเหรียญอย่างเห็นได้ชัด) ผลลัพธ์ของความเท่าเทียมกันอย่างคงที่ของ XOR นั้นแย่ยิ่งกว่าพฤติกรรมแปลก ๆ ที่สลับกันของต้นฉบับ
ความแตกต่างเล็กน้อยทำให้สิ่งนี้อยู่ในกรอบเดิม: นั่นคือให้เป็นลำดับของค่า 15 บิตที่ส่งกลับโดย rand () พร้อมกับเมล็ดที่กำหนดและลำดับจากเมล็ดที่แตกต่างกันs_Yอีกครั้งจะเป็นลำดับของตัวเลขทั้งคู่หรือคี่ทั้งหมดซึ่งเลวร้ายยิ่งกว่าพฤติกรรมสลับคู่ / คี่เดิมX⃗ sXY⃗ sYX⃗ ⊕Y⃗
นี่คือตัวอย่างที่แฮคเกอร์ทำเรื่องแย่ลงในแง่ของ (1) และ (2) โดยการตีความที่สมเหตุสมผล มันแย่ลงในหลาย ๆ วิธีเช่นกัน:
- (3) บิตที่มีนัยสำคัญน้อยที่สุดของ XORed คือความลำเอียงที่เห็นได้ชัดนั่นคือมีความถี่ที่ไม่เท่ากันของ 0 และ 1 ของซึ่งต่างจากตำแหน่งบิตที่กำหนดหมายเลขใด ๆ ในอินพุตใดก็ได้ที่ไม่เอนเอียง
- (4) ในความเป็นจริงสำหรับทุกๆ ตำแหน่งบิตมีคู่ของเมล็ดที่ตำแหน่งบิตนั้นมีอคติในผลลัพธ์ XOR และสำหรับทุกคู่ของเมล็ดจะมีตำแหน่งบิต (อย่างน้อย 5) ที่มีอคติใน XOR ผลลัพธ์.
- (5) รอบระยะเวลาของลำดับทั้งหมดของค่า 15 บิตในผลลัพธ์ XOR คือ 1 หรือเมื่อเทียบกับสำหรับต้นฉบับ214215
ไม่มีของ (3), (4), (5) ชัดเจน แต่ทั้งหมดนั้นสามารถตรวจสอบได้ง่าย
ในที่สุดลองพิจารณาการนำเสนอข้อห้ามของ PRNG อีกครั้งจากตระกูลเดียวกัน ฉันคิดว่าปัญหาที่นี่คือมันไม่เคยชัดเจนว่าสอง PRNGs เป็น "จากครอบครัวเดียวกัน" จนกระทั่ง / จนกว่าจะมีใครบางคนเริ่มใช้ XOR และประกาศ (หรือประกาศโจมตี) สิ่งที่แย่ลงในแง่ของ (1) และ (2) คือจนกระทั่งรูปแบบที่ไม่ใช่แบบสุ่มในเอาต์พุตข้ามขีด จำกัด จากการไม่สังเกตเห็นเพื่อสังเกต / อาย / หายนะและ ณ จุดนั้นมันสายเกินไป
ฉันตกใจกับคำตอบอื่น ๆ ที่นี่ซึ่งให้คำแนะนำอย่างไม่มีเงื่อนไข "แฮคเกอร์ไม่สามารถทำร้าย" บนพื้นฐานของมาตรการทางทฤษฎีซึ่งดูเหมือนว่าฉันจะทำงานได้ไม่ดีในการสร้างแบบจำลองสิ่งที่คนส่วนใหญ่คิดว่าเป็น "ดี" และ "ไม่ดี" เกี่ยวกับ PRNGs ในชีวิตจริง คำแนะนำนั้นขัดแย้งกับตัวอย่างที่ชัดเจนและโจ่งแจ้งซึ่งแฮคเกอร์ทำสิ่งที่แย่กว่านั้นเช่นตัวอย่างแรนด์ () ที่ให้ไว้ข้างต้น ในขณะที่เป็นไปได้ว่า PRNG ที่ค่อนข้าง "แข็งแกร่ง" สามารถแสดงพฤติกรรมตรงกันข้ามเมื่อ XORed กับของเล่น PRNG ที่ถูกแรนด์ () ซึ่งทำให้ XOR เป็นความคิดที่ดีสำหรับพวกเขาฉันไม่เห็นหลักฐานในทิศทางนั้นในทางทฤษฎีหรือ สังเกตุดังนั้นฉันจึงไม่มีเหตุผลที่จะคิดว่ามันเกิดขึ้น
โดยส่วนตัวแล้วถูกกัดด้วยความประหลาดใจโดย XORing rand () ในวัยเด็กของฉันและจากความสัมพันธ์แปลกใจอื่น ๆ อีกมากมายนับไม่ถ้วนตลอดชีวิตของฉันฉันมีเหตุผลเล็กน้อยที่จะคิดว่าผลลัพธ์จะแตกต่างกันถ้าฉันลองใช้กลยุทธ์ที่คล้ายกันอีกครั้ง นั่นคือเหตุผลที่ฉันเองลังเลที่จะ XOR ร่วมกันหลาย PRNGs เว้นแต่จะมีการวิเคราะห์และการตรวจสอบอย่างครอบคลุมเพื่อให้ความมั่นใจกับฉันว่าอาจปลอดภัยที่จะทำเช่นนั้นสำหรับ RNG ที่เป็นปัญหา เป็นวิธีรักษาที่เป็นไปได้เมื่อฉันมีความเชื่อมั่นต่ำในหนึ่ง PRNGs บุคคลหนึ่งหรือมากกว่า XORing พวกเขาไม่น่าจะเพิ่มความมั่นใจของฉันดังนั้นฉันจึงไม่น่าจะใช้มันเพื่อวัตถุประสงค์ดังกล่าว ฉันคิดว่าคำตอบสำหรับคำถามของคุณคือความเชื่อมั่นที่ถือกันอย่างแพร่หลาย