ทำไมเราไม่รวมตัวสร้างจำนวนสุ่ม?


60

มีแอปพลิเคชั่นมากมายที่ใช้ตัวสร้างตัวเลขสุ่มหลอก ดังนั้นผู้คนจึงใช้สิ่งที่พวกเขาคิดว่ายอดเยี่ยมเท่านั้นที่จะพบในภายหลังว่ามันมีข้อบกพร่อง สิ่งนี้เกิดขึ้นกับเครื่องสร้างตัวเลขสุ่มจาวาสคริปต์ RandU เร็วเกินไปเช่นกัน นอกจากนี้ยังมีปัญหาของการเริ่มต้นเริ่มต้นที่ไม่เหมาะสมสำหรับบางอย่างเช่น Twister

ฉันไม่สามารถหาตัวอย่างของใครก็ตามที่รวมเครื่องกำเนิดไฟฟ้าสองตระกูลหรือมากกว่าเข้ากับผู้ดำเนินการ xor ปกติ หากมีพลังงานคอมพิวเตอร์เพียงพอที่จะเรียกใช้สิ่งต่าง ๆ เช่นการใช้งาน java.SecureRandom หรือ Twister ทำไมคนไม่รวมพวกเขา? ISAAC xor XORShift xor RandU ควรเป็นตัวอย่างที่ดีพอสมควรและคุณสามารถเห็นจุดอ่อนของเครื่องกำเนิดไฟฟ้าเดี่ยว ๆ ที่ได้รับการผ่อนปรนจากผู้อื่น นอกจากนี้ยังควรช่วยในการกระจายตัวเลขไปสู่มิติที่สูงขึ้นเนื่องจากอัลกอริทึมภายในนั้นแตกต่างกันโดยสิ้นเชิง มีหลักการพื้นฐานบางอย่างที่พวกเขาไม่ควรนำมารวมกัน?

หากคุณต้องการสร้างตัวสร้างตัวเลขสุ่มจริงผู้คนอาจแนะนำให้คุณรวมแหล่งข้อมูลเอนโทรปีสองแหล่งขึ้นไป ตัวอย่างของฉันแตกต่างกันอย่างไร

ฉันไม่รวมตัวอย่างทั่วไปของตัวเลื่อนการตอบรับเชิงเส้นหลายตัวที่ทำงานร่วมกันเนื่องจากพวกเขามาจากตระกูลเดียวกัน


คำตอบอาจขึ้นอยู่กับแอปพลิเคชัน คุณต้องการใช้ลำดับ pseudorandom เพื่ออะไร
Yuval Filmus

1
คุณพบฟอร์จูน่า ( en.wikipedia.org/wiki/Fortuna_%28PRNG%29 ) มันฟังดูใกล้เคียงกับสิ่งที่คุณอธิบายว่ารวบรวมแหล่งที่มาแบบสุ่มต่างๆไว้เป็นแหล่งเดียว
Little Code

1
@LittleCode จริง ๆ แล้วมันฟังดูต่างออกไปโดยสิ้นเชิง Fortuna ส่งออกข้อมูลจากฟังก์ชันแฮชเดียว มันสับสนกับกลไกการรวบรวมเอนโทรปีที่อ่อนแอก่อนที่จะทำการแฮ็กมันใหม่แม้ว่าฟังก์ชั่นเอาต์พุตเดียว คำถามของฉันเกี่ยวกับการแสดงผลจากฟังก์ชั่นต่างๆ (ทำไมถึงไม่ใช่ 10 ข้อ) หากนี่เป็นอุปกรณ์เติมความเร็วจะไม่เกี่ยวข้องเลย
Paul Uszak

1
George Marsaglia ปลายนักวิจัยที่มีชื่อเสียงในด้านของ PRNG ที่คิดค้นชนิด PRNG ใหม่หลายชนิดเช่นทวีคูณด้วยพกพาและ xor-shift ทำสิ่งนี้อย่างแม่นยำเมื่อเขาเสนอเครื่องกำเนิด KISS ในปี 1990 ซึ่งเป็นการรวมกันของสาม PRNG ประเภทที่แตกต่างกัน ฉันใช้ KISS สำเร็จมาตลอดยี่สิบปีที่ผ่านมาไม่ใช่เพื่อการเข้ารหัสแน่นอน แหล่งที่มารองที่มีประโยชน์เกี่ยวกับการจูบกับเป็น2011 กระดาษโดยเกร็กโรสซึ่งเขาชี้ให้เห็นปัญหากับหนึ่งใน PRNGs ร่างรัฐธรรมนูญซึ่งไม่ได้ทำให้แนวคิดการรวม
njuffa

4
Knuth เกี่ยวข้องกับผลลัพธ์ของการรวมตัวกำเนิดตัวเลขเทียมหลอกๆ (โดยใช้หมายเลขสุ่มหนึ่งตัวเพื่อเลือกตัวสร้างที่จะใช้) ส่งผลให้ฟังก์ชั่นที่มาบรรจบกันเป็นค่าคงที่! ดังนั้นย้อนกลับไปก่อนวันปฏิวัติไมโครคอมพิวเตอร์เขาเตือนเราว่าอย่าผสมเครื่องปั่นไฟแบบสุ่ม
JDługosz

คำตอบ:


7

IIRC (และนี่คือจากหน่วยความจำ) ผู้ขายหนังสือแรนด์ A ล้าน Random Digits ในปี 1955 ทำสิ่งนี้ ก่อนที่คอมพิวเตอร์จะมีราคาถูกผู้คนเลือกสุ่มตัวเลขจากหนังสือเล่มนี้

ผู้เขียนสร้างบิตสุ่มด้วยเสียงอิเล็กทรอนิกส์ แต่มันกลับกลายเป็น biassed (มันยากที่จะทำให้ flipflop ใช้เวลาเท่ากันทุกครั้งกับ flip และ flop) อย่างไรก็ตามการรวมบิตทำให้การกระจายสม่ำเสมอกว่า


45

แน่นอนว่าคุณสามารถรวม PRNG เช่นนี้ได้หากคุณต้องการสมมติว่าพวกเขามีการเพาะอย่างอิสระ อย่างไรก็ตามมันจะช้าลงและอาจจะไม่แก้ปัญหาเร่งด่วนที่สุดที่คนมี

ในทางปฏิบัติหากคุณมีข้อกำหนดสำหรับ PRNG ที่มีคุณภาพสูงมากคุณใช้ PRNG ที่มีการเข้ารหัสที่แข็งแรงซึ่งได้รับการตรวจสอบอย่างดีและคุณปลูกมันด้วยเอนโทรปีที่แท้จริง หากคุณทำสิ่งนี้โหมดความล้มเหลวที่เป็นไปได้มากที่สุดของคุณจะไม่เกิดปัญหากับอัลกอริทึม PRNG โหมดความล้มเหลวที่เป็นไปได้มากที่สุดคือการขาดเอนโทรปีเพียงพอ (หรืออาจเกิดข้อผิดพลาดในการใช้งาน) Xor-ing หลาย PRNG ไม่ได้ช่วยในโหมดความล้มเหลวนี้ ดังนั้นหากคุณต้องการ PRNG ที่มีคุณภาพสูงมากอาจมีจุดเล็ก ๆ น้อย ๆ

อีกทางเลือกหนึ่งถ้าคุณต้องการ PRNG เชิงสถิติที่ดีพอสำหรับการจำลองสถานการณ์โดยทั่วไปข้อกังวลอันดับ 1 คือความเร็ว Xor-ing ทำให้ PRNG ทำงานช้าลงและทำให้มันซับซ้อนขึ้นดังนั้นจึงไม่สามารถตอบสนองความต้องการหลักในบริบทนั้นได้

ตราบใดที่คุณแสดงความระมัดระวังและความสามารถที่เหมาะสม PRNG มาตรฐานนั้นดีเกินพอดังนั้นจึงไม่มีเหตุผลว่าทำไมเราถึงต้องการนักเล่นเกมตัวยง (ไม่จำเป็นต้องมี xor-ing) หากคุณไม่มีความใส่ใจหรือความสามารถในระดับที่น้อยที่สุดคุณอาจจะไม่ได้เลือกสิ่งที่ซับซ้อนเช่น xor-ing และวิธีที่ดีที่สุดในการปรับปรุงสิ่งต่าง ๆ คือการมุ่งเน้นที่การเอาใจใส่และความสามารถในการเลือก PRNG มากกว่าใน xor-ing

ที่สำคัญที่สุด : โดยทั่วไปเคล็ดลับ xor ไม่สามารถแก้ปัญหาที่คนทั่วไปมักใช้เมื่อใช้ PRNG


3
"การขาดเอนโทรปีเพียงพอ ... Xoring PRNG หลายตัวไม่ช่วยเรื่องนี้" - แน่นอนว่ามันสามารถขัดขวางได้เนื่องจากคุณเพิ่มปริมาณเอนโทรปีที่จำเป็นในการหว่าน PRNG ของคุณ นี่คือเหตุผลที่คุณไม่ต้องการให้มันเป็นกิจวัตรประจำวันเพื่อรวม PRNG ที่ผ่านการตรวจสอบอย่างดีแม้ว่ามันจะช่วยปกป้องคุณจากหนึ่งใน PRNG ที่ได้รับการตรวจสอบอย่างดีกลายเป็นขยะสมบูรณ์ (ในการใช้งานที่คุณใช้) .
Steve Jessop

อีกเหตุผลหนึ่งคือข้อผิดพลาดในการใช้งานนั้นไกลทั่วไปมากกว่าปัญหาพื้นฐานด้วยอัลกอริธึม อย่างน้อยที่สุดอัลกอริทึมมาตรฐานสามารถทดสอบกับการนำไปใช้หรือค่าอ้างอิงอื่นซึ่ง xor แบบกำหนดเองไม่สามารถทำได้
Gilles

1
@DW ทำไม "seeded อย่างอิสระ" เนื่องจากคำถามของฉันเกี่ยวข้องกับการรวมกันของครอบครัวของเครื่องกำเนิดไฟฟ้าที่แตกต่างกันแต่ละครอบครัวควรผลิตลำดับผลผลิตที่ไม่ซ้ำกันจากเมล็ดที่เหมือนกัน ตัวอย่างเช่น java.SecureRandom และ RC4 สามารถถูก seed จากคีย์เดียวกันได้ง่ายจากนั้นรวมกัน
Paul Uszak

1
@DW ข้อสันนิษฐานที่ยิ่งใหญ่ที่คุณระบุไว้คือ "ใช้ความแข็งแกร่งของการเข้ารหัส PRNG" ความจริงก็คือมันเป็นไปไม่ได้ในทางปฏิบัติที่จะยืนยันเช่นเดียวกับการเข้ารหัสลับส่วนใหญ่แฮชและอื่น ๆ - จุดอ่อนที่พบในช่วงเวลา พวกเขา "ดีตรวจ" สำหรับความรู้เมื่อวานหรือปีกลาย
ชีฟ

1
@ พอลซัสฉันไม่คิดว่าฉันเคยแย้งว่า xor-ing เครื่องปั่นไฟสองเครื่องทำให้มีแนวโน้มที่จะเป็นแมลงมากกว่า ฉันกำลังบอกว่าถ้าคุณเลือก PRNG ที่ดี (แค่อันเดียว) หนึ่งในโหมดความล้มเหลวที่น่าจะเป็นไปได้มากที่สุดก็คือความล้มเหลวในการสร้างหรือความล้มเหลวในการติดตั้งและเครื่องกำเนิดไฟฟ้าสองตัว (แน่นอนถ้า PRNG เดียวไม่ล้มเหลว xor-ing เครื่องปั่นไฟสองเครื่องก็ไม่มีประโยชน์เช่นกัน) โดยทั่วไปแล้วมันคือการจัดการปัญหาที่ผิด กล่าวอีกนัยหนึ่งเครื่องกำเนิดไฟฟ้า xor-ing ไม่ได้เพิ่มความแน่นอนเพราะมันไม่ได้ระบุสาเหตุที่สำคัญที่สุดของความไม่แน่นอน
DW

19

ในความเป็นจริงมีการประกาศสิ่งที่ล้ำสมัยด้วยการทำสิ่งนี้อย่างแม่นยำ

David Zuckerman ศาสตราจารย์ด้านวิทยาศาสตร์คอมพิวเตอร์ของมหาวิทยาลัยเท็กซัสและนักศึกษาปริญญาเอก Eshan Chattopadhyay พบว่าสามารถสร้างหมายเลขสุ่ม "คุณภาพสูง" ได้โดยการรวมแหล่งข้อมูลแบบสุ่มคุณภาพต่ำสองแหล่งเข้าด้วยกัน

นี่คือกระดาษของพวกเขา: ฟังก์ชั่นแยกสองแหล่งอย่างชัดเจนและฟังก์ชั่นที่ยืดหยุ่น


8
นี่เป็นบทความเชิงทฤษฎีล้วนๆในหัวข้อที่แตกต่างกันซึ่งไม่มีความเกี่ยวข้องใด ๆ ในทางปฏิบัติแม้จะมีความพยายามประชาสัมพันธ์โดย UT
Yuval Filmus

4
@Yuval Filmus - คุณสนใจที่จะขยายความคิดเห็นนั้นหรือไม่
NietzscheanAI

8
มีการแบ่งแยกอย่างใหญ่หลวงระหว่างทฤษฎีและการปฏิบัติ โดยทั่วไปผู้ปฏิบัติงานไม่สนใจทฤษฎีและในทางกลับกัน ในกรณีนี้สาขา PR ของ UT ตัดสินใจที่จะยึดติดอยู่กับทฤษฎีที่ยอดเยี่ยมโดยอธิบายว่ามันเกี่ยวข้องกับการปฏิบัติจริงซึ่งไม่ได้เป็นเช่นนั้น ปัญหาที่พิจารณาในบทความไม่น่าสนใจมากนักจากมุมมองของภาคปฏิบัติและมีวิธีแก้ปัญหาง่าย ๆ ที่ทำงานได้ดีพอแม้ว่าจะเป็นไปไม่ได้ที่จะพิสูจน์ว่าพวกเขาทำ
Yuval Filmus

2
ยิ่งกว่านั้นบทความนี้เป็นเพียงงานเดียวในด้านทฤษฎีของเครื่องสกัด คุณสามารถเรียกเก็บเงินกระดาษอื่น ๆ ในพื้นที่ในลักษณะเดียวกัน พวกเขาทั้งหมดเกี่ยวกับการรวมแหล่งที่อ่อนแอเพื่อสร้างแหล่งที่แข็งแกร่ง ความแตกต่างอยู่ในพารามิเตอร์เท่านั้น
Yuval Filmus

3
ในที่สุดการก่อสร้างในกระดาษน่าจะเป็น overkill ไม่ใช่สิ่งที่คุณต้องการใช้ พารามิเตอร์คอนกรีตสำหรับการก่อสร้างประเภทนี้ยากที่จะระบุและพวกเขามักจะไม่ดีอย่างยิ่งเนื่องจากเอกสารมักจะมุ่งเน้นไปที่ระบอบ asymptotic และไม่สนใจค่าคงที่
Yuval Filmus

9

สมมติว่าเป็นลำดับไบนารีนั่นคือแต่ละตัวเป็นตัวแปรสุ่มที่ได้รับการสนับสนุนบนและตัวแปรนั้นไม่จำเป็นต้องเป็นอิสระ เราสามารถคิดว่าลำดับนี้ถูกสร้างขึ้นด้วยวิธีต่อไปนี้: อันดับแรกเราสุ่มคีย์แบบสุ่มอย่างสม่ำเสมอแล้วใช้ฟังก์ชันเพื่อสร้างลำดับหลอกเทียมX1,,XnXi{0,1}X1,,XnKf(K)

เราจะวัดซีเควนซ์ได้ดีแค่ไหน? ขณะที่มันเป็นไปได้ที่จะวัดว่าดีสำนึกโดยเฉพาะอย่างยิ่งคือ (พูดโดยใช้ความซับซ้อน Kolmogorov) นี่ผมจะมีสมาธิในมาตรการซึ่งขึ้นอยู่กับการจัดจำหน่ายทั้งหมดของตัวแปรสุ่มX_n) ตัวอย่างหนึ่งคือเอนโทรปี แต่เราจะต้องการเพียงสองคุณสมบัติของการวัดของเรา : (ใหญ่กว่าหมายถึงลำดับที่สุ่มขึ้น)X1,,Xn(X1,,Xn)LL()

  • หากเป็นกำหนดลำดับ (เช่นลำดับคงที่) แล้วX_n) L ( X 1y ที่1 , ... , X nY n ) = L ( X 1 , ... , X n )y1,,ynL(X1y1,,Xnyn)=L(X1,,Xn)

  • ถ้าเป็นลำดับหลอกเทียมอิสระสองลำดับเป็นบิตสุ่มอิสระและแล้ว1)X0,X1T{0,1}Z=XTL(Z)min(X0,X1)

คุณสมบัติแรกหมายความว่าการวัดนั้นไม่แปรผันภายใต้การพลิกบิตที่คุณสมบัติที่สองหมายความว่าหากเราผสมการแจกแจงสองแบบผลลัพธ์ก็จะดีอย่างน้อยเท่ากับแย่ลงiX,Y

การวัดแบบแผนใด ๆ ที่สมเหตุสมผลจะทำให้เกิดความพึงพอใจในคุณสมบัติแรก สถานที่ให้บริการที่สองคือความพึงพอใจโดยมาตรการที่นิยมมากที่สุดเช่นเอนโทรปีของและนาทีเอนโทรปีH_HH

ตอนนี้เราสามารถระบุและพิสูจน์ทฤษฎีบทที่แสดงว่า XORing ลำดับหลอกเทียมสองชุดเป็นความคิดที่ดีเสมอ

ทฤษฎีบท. ปล่อยให้เป็นลำดับ pseudorandom สองชุดที่มีความยาวเท่ากันและให้เป็นมาตรการสุ่มแบบสุ่มที่ยอมรับได้ จากนั้นX,YL

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

พิสูจน์ สมมติว่า(Y) จากนั้นเป็นส่วนผสมของการกระจายผสมตามการกระจายของYตั้งแต่และมีส่วนผสมเป็นอย่างน้อยดีเท่าการกระจายที่เลวร้ายที่สุดที่ถูกผสมเราได้รับ(X) 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 ราคาแพง)


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท เมื่อคุณมาถึงจุดสิ้นสุดที่สร้างสรรค์โปรดแก้ไขคำตอบเพื่อรวมผลลัพธ์ของการสนทนาของคุณ
Raphael

4

ฉันจะให้ช็อตนี้เนื่องจากฉันถูกรบกวนโดยคำแนะนำที่ให้ไว้ในคำตอบอื่น ๆ

ให้เป็นลำดับบิตแบบไม่สิ้นสุดที่สร้างโดย RNG สองตัว (ไม่จำเป็นต้องมี PRNG ซึ่งกำหนดล่วงหน้าเมื่อทราบสถานะเริ่มต้น) และเรากำลังพิจารณาความเป็นไปได้ในการใช้ลำดับด้วยความหวังว่าจะปรับปรุงพฤติกรรมในบางแง่มุม มีวิธีการมากมายที่อาจจะดีกว่าหรือแย่กว่าเมื่อเทียบกับแต่ละและ ; นี่เป็นเพียงเล็กน้อยที่ฉันเชื่อว่ามีความหมายมีประโยชน์และสอดคล้องกับการใช้คำปกติ "ดีกว่า" และ "แย่ลง":X,YXYXYXY

  • (0) ความน่าจะเป็นของการสุ่มที่แท้จริงของลำดับนั้นเพิ่มขึ้นหรือลดลง
  • (1) ความน่าจะเป็นที่เพิ่มขึ้นหรือลดลงที่ไม่สามารถสังเกตได้ที่สังเกตได้ (สำหรับผู้สังเกตการณ์บางคนที่ใช้การตรวจสอบจำนวนหนึ่งตามที่คาดการณ์)
  • (2) ความรุนแรง / ความชัดเจนของการเพิ่มหรือลดที่ไม่สามารถสังเกตได้ที่สังเกตได้

ก่อนอื่นลองคิดถึง (0) ซึ่งเป็นเพียงหนึ่งในสามที่มีความหวังว่าจะแม่นยำ โปรดสังเกตว่าหากในความเป็นจริงทั้งสองอินพุต RNGs นั้นเป็นแบบสุ่มไม่ฝักใฝ่ฝ่ายใดและเป็นอิสระจากอีกฝ่ายหนึ่งผลลัพธ์ XOR ก็จะสุ่มและไม่เอนเอียงอย่างแท้จริงเช่นกัน เมื่อพิจารณาแล้วให้คำนึงถึงกรณีที่คุณเชื่อว่าเป็นบิตสตรีมที่แยกแบบไม่ลำเอียงอย่างแท้จริง แต่คุณไม่แน่ใจอย่างสมบูรณ์ ถ้าเป็นความน่าจะเป็นตามลำดับที่คุณทำผิดเกี่ยวกับพวกมันแต่ละคนความน่าจะเป็นที่นั้นไม่ใช่สุ่มอย่างแท้จริงแล้วคือ ในความเป็นจริงมากน้อยตั้งแต่X,YεX,εYXYεXεY<min{εX,εY}εX,εYนั้นถือว่าใกล้เคียงกับ 0 มากที่สุด ("คุณเชื่อว่าพวกมันสุ่มอย่างแท้จริง") และในความเป็นจริงมันดียิ่งกว่านั้นเมื่อเราคำนึงถึงความเป็นไปได้ของเป็นอิสระอย่างแท้จริงแม้ว่าจะไม่ได้สุ่มอย่างแท้จริง: ดังนั้นเราสามารถสรุปได้ว่าในแง่ (0), XOR ไม่สามารถทำร้ายและอาจช่วยได้มากX,Y

Pr(XY 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 XY X =Y X =not(Y )XY X Y X Y X Y XYXYXYX=YX=not(Y)XYXYXและจำเป็นต้อง "ปิด" เป็นอิสระเพื่อให้แฮคเกอร์ไม่สังเกตได้ ในความเป็นจริงการไม่ขึ้นอยู่กับการสังเกตได้สามารถกำหนดได้อย่างสมเหตุสมผลว่าการไม่อยู่ในรูปแบบสุ่มYXY

การพึ่งพาความประหลาดใจดังกล่าวกลายเป็นปัญหาใหญ่จริงๆ


ตัวอย่างของสิ่งที่ผิดพลาด

คำถามระบุว่า "ฉันไม่รวมตัวอย่างทั่วไปของการเลื่อนการตอบรับเชิงเส้นหลายครั้งที่ทำงานร่วมกันเนื่องจากพวกเขามาจากครอบครัวเดียวกัน" แต่ฉันจะไม่รวมการกีดกันนั้นในขณะนั้นเพื่อให้ตัวอย่างชีวิตจริงที่เรียบง่ายชัดเจนของสิ่งที่สามารถผิดพลาดกับ 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 ต่อเนื่องในการสำรวจบิตที่สูงขึ้นอย่างต่อเนื่องเผยให้เห็นรูปแบบที่ฉันระบุไว้ก่อนหน้านี้: นั่นคือบิตลำดับสูงกว่าถัดไป การเคารพลำดับสูงสุดนี้เป็นประโยชน์สูงสุดของพวกเขาทั้งหมด อย่างไรก็ตามโปรดทราบว่าไม่มีขีด จำกัด ขาวดำ "บิตมีประโยชน์บิตไม่มีประโยชน์" ที่นี่; ทั้งหมดที่เราสามารถพูดได้ก็คือตำแหน่งบิตที่มีตัวเลขมีระดับของประโยชน์ / ความไร้ประโยชน์ที่แตกต่างกันฉัน- 1ii1

ฉันยังลองสิ่งต่าง ๆ เช่นการตรวจสอบผลลัพธ์เพิ่มเติมหรือ XORing ค่าที่ส่งคืนจากการโทรหลายครั้งไปยัง rand () คู่ของค่าแรนด์ต่อเนื่อง () คู่กันเป็นหายนะแน่นอน - มันส่งผลให้ตัวเลขคี่ทั้งหมด! สำหรับจุดประสงค์ของฉัน (กล่าวคือการสร้างลำดับการพลิกเหรียญอย่างเห็นได้ชัด) ผลลัพธ์ของความเท่าเทียมกันอย่างคงที่ของ XOR นั้นแย่ยิ่งกว่าพฤติกรรมแปลก ๆ ที่สลับกันของต้นฉบับ

ความแตกต่างเล็กน้อยทำให้สิ่งนี้อยู่ในกรอบเดิม: นั่นคือให้เป็นลำดับของค่า 15 บิตที่ส่งกลับโดย rand () พร้อมกับเมล็ดที่กำหนดและลำดับจากเมล็ดที่แตกต่างกันs_Yอีกครั้งจะเป็นลำดับของตัวเลขทั้งคู่หรือคี่ทั้งหมดซึ่งเลวร้ายยิ่งกว่าพฤติกรรมสลับคู่ / คี่เดิมXsXYsYXY

นี่คือตัวอย่างที่แฮคเกอร์ทำเรื่องแย่ลงในแง่ของ (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 พวกเขาไม่น่าจะเพิ่มความมั่นใจของฉันดังนั้นฉันจึงไม่น่าจะใช้มันเพื่อวัตถุประสงค์ดังกล่าว ฉันคิดว่าคำตอบสำหรับคำถามของคุณคือความเชื่อมั่นที่ถือกันอย่างแพร่หลาย


ดังนั้นคุณจะอธิบายการใช้ A5 / 1 ด้วยผู้คนนับพันล้านได้อย่างไร?
Paul Uszak

@PaulUszak ฉันไม่มีความคิด A5 / 1 ถูกใช้โดยผู้คนหลายพันล้านคนขัดแย้งกับสิ่งที่ฉันพูดหรือไม่?
Don Hatch

มันคือสาม prngs (อันที่จริงจากตระกูลเดียวกัน) ซึ่งรวมกันเป็นรูปแบบที่ดีกว่าในลักษณะที่รบกวนและทำให้คุณ
ตกใจ

สิ่งที่ฉันถูกรบกวนและตื่นตระหนกคือคำแนะนำอย่างไม่มีเงื่อนไข "ถ้าคุณไม่แน่ใจไปข้างหน้าและแฮคเกอร์ด้วยกันเป็นกลุ่ม RNG; มันไม่สามารถทำให้สิ่งเลวร้ายลงได้" ฉันไม่ได้ตั้งใจจะพูดหรือบอกเป็นนัยว่าแฮคเกอร์ไม่ดีในทุกกรณีและฉันไม่มีความเห็นใด ๆ เกี่ยวกับ A5 / 1 หรือการใช้แฮคเกอร์ในนั้น มันจะช่วยได้หรือไม่ถ้าฉันเปลี่ยนคำแถลงสรุปโง่สุดท้ายของฉันเพื่อทำให้ชัดเจนขึ้น
Don Hatch

1
ฉันแทนที่ simplistic "เพียงแค่บอกว่าไม่ XORing RNGs" ในตอนท้ายด้วยสิ่งที่เป็นจริงมากขึ้นและหวังว่าจะทำให้เข้าใจผิดน้อยลง
Don Hatch

0

การปฏิเสธความรับผิด: คำตอบนี้เป็นเรื่องเกี่ยวกับ "เราเป็นเราไม่ได้ทำมัน" และไม่ใช่ "นี่เป็นข้อพิสูจน์ทางคณิตศาสตร์ว่าทำไมมันสามารถหรือไม่สามารถทำงานได้" ฉันไม่อ้างว่า XOR เปิดตัวช่องโหว่การเข้ารหัสใด ๆ ประเด็นของฉันก็คือประสบการณ์นั้นแสดงให้เราเห็นว่าแม้แต่แผนการที่เรียบง่ายที่สุดก็มักจะแนะนำผลที่ไม่คาดคิด - และนี่คือเหตุผลที่เราหลีกเลี่ยงพวกเขา

"Randomness" เป็นเพียงส่วนหนึ่งของภูเขาน้ำแข็งเมื่อพูดถึง RNGs และ PRNGs มีคุณสมบัติอื่น ๆ ที่มีความสำคัญเช่นความสม่ำเสมอ

ลองนึกภาพลูกเต๋าทั่วไปที่ค่อนข้างดี RNG ด้วยตัวมันเอง แต่ตอนนี้สมมติว่าคุณต้องการช่วง 1-5 แทนที่จะเป็น 1-6 สิ่งแรกที่อยู่ในใจคือการลบใบหน้าทั้ง 6 และแทนที่ด้วย 1 พิเศษซาก "สุ่ม" (ผลลัพธ์ยังคงสุ่มจริง ๆ ) อย่างไรก็ตามความสม่ำเสมอสม่ำเสมอทนทุกข์ทรมานอย่างมาก: ตอนนี้ 1 เป็นสองเท่าของผลลัพธ์อื่น ๆ

การรวมผลลัพธ์จาก RNG หลายรายการเป็นความชันลื่นในทำนองเดียวกัน เช่น. การเพิ่มลูกเต๋า 2 ลูกอย่างง่าย ๆ จะทำการล้างความสม่ำเสมอในขณะที่ "7" ตอนนี้มีโอกาสมากกว่า "2" หรือ "12" 6 เท่า ฉันยอมรับว่า XOR นั้นดูดีกว่าการมองแวบแรก แต่ใน PRNG ไม่มีอะไรเกิดขึ้นเมื่อมองแวบแรก

นี่คือเหตุผลที่เรามักจะยึดติดกับการใช้งานที่เป็นที่รู้จัก - เนื่องจากมีคนใช้เวลาและเงินจำนวนมากในการวิจัยพวกเขาและข้อบกพร่องทั้งหมดเป็นที่รู้จักกันดีเข้าใจและสามารถแก้ไขได้ เมื่อคุณเปิดตัวของคุณเองคุณอาจสร้างช่องโหว่และคุณควรใช้ความพยายามที่คล้ายกันเพื่อพิสูจน์มัน ดังตัวอย่างของลูกเต๋าที่แสดงการรวมกันอาจไม่แตกต่างจากการสร้างขึ้นใหม่ตั้งแต่เริ่มต้น

ความปลอดภัยเป็นสายโซ่ที่แข็งแกร่งพอ ๆ กับองค์ประกอบที่อ่อนแอที่สุด กฎง่ายๆในการรักษาความปลอดภัย: เมื่อใดก็ตามที่คุณรวม 2 สิ่งคุณมักจะได้รับผลรวมของข้อบกพร่องไม่ใช่จุดแข็ง


7
ไม่เห็นด้วยอย่างยิ่ง. หากคุณแฮคเกอร์สุ่มโดยสุ่มตามลำดับคุณยังคงได้รับสุ่มแบบสุ่ม ในทำนองเดียวกันถ้าคุณ XOR ลำดับหลอกเทียมอิสระสองชุด(เช่นสร้างด้วยคีย์ที่แตกต่างกัน) คุณจะได้รับบางสิ่งที่แข็งแกร่งพอ ๆ กับแต่ละอย่าง
Yuval Filmus

3
ดูเหมือนว่าฉันผิด กรณีปกติที่นี่คือฉันคิดว่าฉันมี RNG ที่มีคุณภาพสูงมากสองตัวที่ผลิตบิตสุ่มอย่างแท้จริง แต่มีเอปไซลอนที่มีโอกาสเล็กน้อยที่ฉันอาจจะเข้าใจผิดเกี่ยวกับหนึ่ง (หรือน่าจะน้อยกว่าทั้งคู่) ถ้าฉันให้พวกเขาอยู่ด้วยกันตราบใดที่ฉันพูดถูกพวกเขาอย่างน้อยหนึ่งผลจะสุ่มอย่างแท้จริงและฉันก็เป็นคนดี ดังนั้นเมื่อรวมเข้าด้วยกันฉันจึงลดโอกาสที่จะมี RNG ที่ไม่ดีจากเอปไซลอนคร่าวๆ / 2 เป็นเอปไซลอนขนาดเล็กมาก ^ 2 ซึ่งถือเป็นชัยชนะอย่างแน่นอน ฉันสงสัยว่าพลวัตที่คล้ายกันจะเกิดขึ้นแม้ในกรณีที่ถูกตัดและลองน้อยกว่า
Don Hatch

2
ฉันยังไม่มั่นใจ เมื่อฉันเขียนว่า "สุ่มอย่างแท้จริง" ฉันหมายถึง "สุ่มอย่างสม่ำเสมอ" หากคุณแฮคเกอร์สุ่มแบบสุ่มด้วยลำดับแบบสุ่มคุณจะได้รับสุ่มแบบสุ่ม
Yuval Filmus

2
@ DonHatch แน่นอนว่าจะมีคุณสมบัติ สมมติว่า PRNG ของคุณสร้างลำดับความยาว 100 จากนั้นเป็นลำดับที่มีเสียงดังในลำดับเดียวกันเป็นต้น สมมติว่าความสัมพันธ์บิตของสำเนาที่สองกับครั้งแรกที่มีการ 2 XORed ลำดับตอบสนอง 2 ตั้งแต่มันยุติธรรมที่จะบอกว่าความสัมพันธ์ไม่ได้ "ขยายอย่างไม่มีการลด" แต่ลดลงอย่างไม่มีการลด Z i = X iY ฉัน Pr [ Z i + 100 = Z i ] = ( 1 + ϵ 2 ) / 2 ϵ 2| ϵ |Pr[Xi+100=Xi]=(1+ϵ)/2Zi=XiYiPr[Zi+100=Zi]=(1+ϵ2)/2ϵ2|ϵ|
Yuval Filmus

3
@YuvalFilmus คุณอาจถูกต้องว่าความสัมพันธ์ระหว่างรายการ i และรายการ i + 100 ลดลงอย่างไม่มีนัยสำคัญ แต่นั่นไม่ใช่ประเด็น สำหรับตัวอย่างที่เฉพาะเจาะจงมากและในชีวิตจริง: ฉันจำได้ว่าการใช้งาน Crappy เก่า () การใช้งานบน Unix มีพฤติกรรมเป็นระยะในบิตลำดับต่ำสุดของจำนวนเต็ม 31 บิตแต่ละคืนซึ่งคนส่วนใหญ่ไม่สังเกตเห็น แฮคเกอร์ที่มีลำดับของ ints พร้อมสำเนาที่ถูกเลื่อนของตัวเอง (ซึ่งเป็นสิ่งที่คุณได้รับเมื่อคุณใช้เมล็ดพันธุ์ที่แตกต่างกัน) ขนาดกะโชคร้ายคุณจะได้ตัวเลขทั้งหมด นั่นเป็นมากยิ่งกว่าปัญหาในลำดับเดิมเพื่อวัตถุประสงค์มากที่สุด
Don Hatch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.