จะตรวจพบได้อย่างไรว่าตัวสร้างตัวเลขนั้นไม่ได้สุ่มอย่างแท้จริง?


20

ฉันได้ยินมาว่าการสร้างตัวเลขสุ่มในคอมพิวเตอร์นั้นไม่ได้สุ่มจริงๆ แต่ไม่มีวิธีที่มีประสิทธิภาพในการตรวจจับ จะตรวจจับได้อย่างไร?


1
โพสต์นี้อาจช่วยคุณได้
Anton

6
ในความเสี่ยงที่จะเกิดเสียงอึกทึกคุณไม่สามารถพูดด้วยความมั่นใจได้ว่าแหล่งข้อมูลที่กำหนดไม่ได้สุ่มหากคุณตรวจสอบผลลัพธ์ทั้งหมด คุณสามารถพลิกเหรียญที่ยุติธรรมครั้งติดต่อกันและรับหัวทุกครั้งและโอกาสที่จะได้ก้อยเมื่อโยน10 100 + 1เซนต์ยังคงเป็น 50% โดยการตรวจสอบแหล่งที่มาเรามักจะสามารถระบุสิ่งที่ไม่สุ่ม (เช่นเครื่องกำเนิดตัวเลขเทียมเทียม ... เราสามารถทำนายลำดับจากเมล็ดและอัลกอริทึม) แหล่งที่มาที่ชัดเจนของการสุ่มอาจไม่เข้าใจเพียงพอที่จะคาดการณ์ได้อย่างน่าเชื่อถือ นี่คือปรัชญาแม้ว่า 1010010100+1
Patrick87

@ Patrick87 ถ้าด้วย "ความแน่นอน" คุณหมายถึงคณิตศาสตร์นั่นเป็นเรื่องจริง อย่างไรก็ตามมีการทดสอบทางสถิติที่สามารถให้ความสำคัญกับคุณตามอำเภอใจ (ข้อมูลคือ "ดี")
กราฟิลส์

@ Patrick87 มีความเสี่ยงที่จะเกิดเสียงทางโลก ... คุณพูดว่า "คุณสามารถพลิกเหรียญที่ยุติธรรมครั้งติดต่อกันและได้หัวทุกครั้ง" ... ไม่ฉันไม่สามารถทำได้ แบบจำลองใด ๆ ที่ช่วยให้ฉันเห็นแม้แต่หัว10 3ในแถวและยังเชื่อว่าเป็นเหรียญที่ยุติธรรมไม่สามารถจับความเป็นจริงได้เป็นอย่างดี นี่เป็นปรัชญาอย่างแน่นอน ;-)10100103
Don Hatch

คำตอบ:


15

คอมพิวเตอร์ถูกสุ่มจริง ๆ :

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

เมล็ด:

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

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

อัลกอริทึมที่สุ่มเพียงพอ:

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

ทีนี้สมมติว่าคุณคิดอัลกอริธึมของคุณเองเพื่อทำสิ่งนี้และคุณอ้างว่าตัวเลขที่คุณคิดขึ้นมานั้นค่อนข้างใกล้เคียงกับการสุ่มเมื่อคุณให้เมล็ดที่แตกต่างกัน เราจะทดสอบว่ามันดีแค่ไหน?

ตอนนี้เราต้องการอัลกอริทึมที่จะใช้ในเมล็ดดำเนินการบางอย่างและสร้างตัวเลขสุ่ม ที่ง่ายที่สุดอัลกอริทึมก็สามารถส่งออกเมล็ด - มันไม่ได้ให้หมายเลขเดียวกันในแต่ละครั้งและเมล็ดสุ่มให้เราออกสุ่ม แต่ชัดเจนว่าไม่ใช่สิ่งที่เราต้องการ ในทางกลับกันอัลกอริธึมอาจค่อนข้างซับซ้อนเช่นเดียวกับเครื่องกำเนิดไฟฟ้าเทียมปลอมจำนวนมาก เราจะบอกได้อย่างไรว่าอัลกอริธึมใดให้ตัวเลข "สุ่ม" จากเมล็ดที่ไม่จำเป็นต้องสุ่มของเรา หากเราไม่ได้รับอย่างแน่นอนเราจะบอกได้อย่างไรว่าอะไรดีที่สุด?

1n

สุ่มพอที่จะหลอกผู้โจมตี:

ตอนนี้สิ่งที่คุณอาจอ้างถึงคือ Cryptographially Secure Pseudorandom Generators ฉันคิดว่าวิธีที่ดีที่สุดในการอธิบายเรื่องนี้คือในบริบทของข้างต้น - ที่นี่เราใช้การสุ่มของเราสำหรับการเข้ารหัสดังนั้นเมื่อเราออกแบบการทดสอบสิ่งที่เราใส่ใจจริงๆก็คือใครบางคนจะไม่สามารถแตกหักได้ ความปลอดภัยของเราโดยการคาดการณ์สิ่งที่เราสุ่มเลือกหมายเลข ฉันไม่ทราบระดับของความคุ้นเคยกับการเข้ารหัส แต่ลองจินตนาการว่าเรากำลังทำการแทนที่แบบง่าย ๆ --- ตัวอักษรแต่ละตัวจะถูกแทนที่ด้วยตัวอักษรอื่น เราต้องการเลือกการแทนที่เหล่านี้แบบสุ่มดังนั้นจึงเป็นการยากที่ผู้โจมตีจะคาดเดา แต่ถ้าเขาสามารถคิดได้ว่าเครื่องกำเนิดตัวเลขแบบสุ่มของฉันทำงานอย่างไรเขาจะสามารถแก้ปัญหาตัวเลขทั้งหมดได้! ดังนั้นอัลกอริทึมการเข้ารหัสลับจึงต้องใช้ตัวสร้างตัวเลขสุ่มซึ่งยากต่อการเดาโดยเฉพาะ

ด้วยเหตุนี้ CSPRG จึงถูกกำหนดในแง่ของอัลกอริธึมอื่น ๆ ที่แก้ปัญหาได้ดีเพียงใด (ซึ่งเป็นที่มาของคำถามของคุณในที่สุด) โดยเฉพาะสมมุติว่าฉันมี CSPRG ซึ่งฉันจะเรียกว่าอาร์อาร์เป็น CSPRG ถ้าหากไม่มีอัลกอริทึมที่เป็นไปได้ที่สามารถเดาได้ว่าบิตใดจะส่งออกต่อไป สิ่งนี้เป็นจริงแม้ว่าคุณจะรู้บิตก่อนหน้านี้ทั้งหมดที่มันส่งออก!

สมมุติว่าห้าบิตแรกที่ CSPRG ของฉันมีเอาต์พุตคือ 10100 คุณไม่ทราบอินพุตที่ฉันใช้กับโปรแกรม แต่คุณสามารถเข้าถึงรหัสที่ฉันใช้เขียน CSPRG ของฉันได้ ดังนั้นการอ้างสิทธิ์จึงเป็นไปไม่ได้ที่คุณจะเขียนโปรแกรมเพื่อตัดสินใจว่าเอาต์พุตบิตถัดไปจะเป็น 101000 หรือ 101001

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


7
นี่คือคำตอบที่ดี (แต่ไม่สมบูรณ์) โดยรวม แต่มีประเด็นสองข้อที่ไม่ถูกต้อง “ การสุ่มตัวอย่างที่แท้จริงนั้นเป็นไปไม่ได้สำหรับคอมพิวเตอร์เนื่องจากทุกสิ่งที่พวกเขาทำนั้นถูกกำหนดไว้แล้ว” นั่นไม่จริงเสมอไปโปรเซสเซอร์บางตัวมีฮาร์ดแวร์ RNG คอมพิวเตอร์สามารถตอบสนองต่ออินพุตภายนอกซึ่งอาจเป็นแบบสุ่ม “ …สำหรับวิทยาการเข้ารหัสลับดังนั้นเราไม่สนใจจริงๆว่า“ สุ่ม” พวกมันอยู่ในรูปแบบของการแจกแจงอย่างไร: จริง ๆ แล้วบางครั้งการแจกแจงแบบสม่ำเสมอมีความสำคัญในการเข้ารหัสลับเช่น IV สำหรับ CBC และพารามิเตอร์ k ใน DSA
Gilles 'ดังนั้นหยุดความชั่วร้าย'

เขาเขียนว่า "ถ้าไม่มีการเพิ่มนอกจากนี้ทุกอย่างที่คอมพิวเตอร์ทำจะถูกกำหนด" การเพิ่มภายนอกคือการอ้างอิงไปยังอุปกรณ์เช่น RNG ตามที่คุณพูดถึง ความสามารถในการคำนวณของเราจะเท่ากับของ TM ซึ่งสุ่มไม่ได้
Kent Munthe Caspersen

ถ้าฉันจำได้อย่างถูกต้องฉันเพิ่มว่าหลังจากความคิดเห็นของ Gilles
SamM

4

เมื่อเร็ว ๆ นี้ฉันพบโพสต์ที่ดีเกี่ยวกับการสุ่มในการคำนวณใน MIT CSAIL Theory of Computation Group บล็อก: คุณช่วยบอกได้ไหมว่าบิตนั้นสุ่ม?

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

จากนั้นจะสรุปผลลัพธ์ล่าสุดบางอย่างเกี่ยวกับการเข้ารหัสควอนตัม โดยเฉพาะอย่างยิ่งวิธีการทดสอบอย่างมีประสิทธิภาพว่าเอาต์พุตของอุปกรณ์บางประเภทเป็นการสุ่มอย่างแท้จริง (โปรโตคอลการขยายแบบสุ่ม)

ตัวอย่างเช่นดูผลงานล่าสุดโดยUmesh Vazirani, Thomas Vidick, ลูกเต๋าควอนตัมที่ผ่านการรับรอง (หรือการขยายการสุ่มเลขชี้กำลังที่ทดสอบได้)

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


3

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

ชุดทดสอบ Diehardรวมวิธีการที่แตกต่างกัน


0

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

คำตอบสั้น ๆ ก็คือ PRNG ที่ไม่สำคัญถูกสร้างขึ้นเพื่อไม่ให้ตรวจจับอัลกอริทึมของมัน โดยทั่วไปถ้า PRNG คือสิ่งที่เรียกว่า "ปลอดภัย" แม้ว่าผู้โจมตีจะรู้ขั้นตอนวิธีที่ใช้ในการสร้างลำดับหลอกเทียมพวกเขาไม่สามารถคาดเดาพารามิเตอร์เฉพาะที่ใช้ในการสร้างลำดับ ด้วยวิธีนี้ pseudorandomness มีความสัมพันธ์ลึกซึ้งกับการเข้ารหัสและเราสามารถพูดคุยเกี่ยวกับ "การทำลาย" PRNG ในลักษณะเดียวกับที่อัลกอริทึมการเข้ารหัสสามารถ "แตก" ได้ มีงานวิจัยมากมายในพื้นที่นี้มันเป็นพื้นที่แอคทีฟแถวหน้าของการเข้ารหัส

สำหรับ "trivial" PRNGs เช่นพูดเป็นเครื่องกำเนิดเชิงเส้นตรงถ้าผู้โจมตีรู้อัลกอริธึมที่ใช้ในการสร้างมันและมันไม่ได้ถูกสร้างขึ้นด้วย"bignums"พื้นที่การค้นหาคือ "ค่อนข้างเล็ก" และผู้โจมตีสามารถหาพารามิเตอร์ในทางทฤษฎี ใช้โดย PRNG โดยเฉพาะอย่างยิ่งโดยกำลังดุร้ายและลองชุดค่าผสมทั้งหมด

PRNGs สามารถใช้งานได้ในทางปฏิบัติ (อีกครั้งขึ้นอยู่กับ "ความปลอดภัย") ในบางกรณีโดยการใช้ชุดทดสอบสถิติเชิงสุ่มขนาดใหญ่ เช่นนี่คือเหตุผลของโปรแกรม"Dieharder" (โดย Brown) นอกจากนี้ยังมีชุด NIST

ความยากลำบากที่แท้จริง / ความแข็งของการทำลาย PRNGs ยังไม่ได้รับการพิสูจน์ทางทฤษฎีอย่างเคร่งครัด แต่โดยพื้นฐานแล้วเกี่ยวข้องกับสิ่งที่เรียกว่า "กับดัก" หรือ"ฟังก์ชันทางเดียว"ซึ่งสามารถคำนวณได้อย่างมีประสิทธิภาพในทิศทางเดียว . มีปัญหาบางอย่างที่เปิดในการเข้ารหัสเกี่ยวกับความแข็งแบบสุ่ม คำถามเหล่านี้เกี่ยวข้องกับการแยกคลาสที่ซับซ้อนเช่นคำถาม P =? NP ที่มีชื่อเสียง

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

ในฐานะที่เป็น Gilles ชี้ให้เห็นในความคิดเห็นที่มีอยู่RNGs ที่ใช้ฮาร์ดแวร์สร้างขึ้นจากกระบวนการทางกายภาพทางกายภาพเช่นที่เกี่ยวข้องกับเสียงควอนตัม สิ่งเหล่านี้หากวิศวกรรมถูกต้องจะไม่แตก


"PRNG ที่ไม่สำคัญถูกสร้างขึ้นเพื่อไม่ให้ตรวจจับอัลกอริทึมของพวกเขา (มา)" - ฉันไม่คิดว่ามันถูกต้อง ในความเป็นจริงประโยคถัดไปของคุณขัดแย้งกับมันมาก คุณต้องการแก้ไขคำตอบเพื่อแก้ไขปัญหานี้หรือไม่?
DW

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

1
ข้อคัดค้านที่เฉพาะเจาะจงของฉันคือประโยคนั้นฟังดูผิดสำหรับฉัน: ดูเหมือนว่าคุณกำลังบอกว่า PRNG ได้รับการออกแบบมาเพื่อให้บางคนที่สังเกตการณ์ผลลัพธ์ของพวกเขาไม่สามารถอนุมานได้ว่าอัลกอริทึมนั้นคืออะไร PRNG ส่วนใหญ่ไม่ได้สร้างขึ้นเพื่อป้องกันใครบางคนจากการเรียนรู้อัลกอริทึม; โดยทั่วไปอัลกอริทึมเป็นสาธารณะ บางทีคุณอาจหมายถึงว่า PRNG ถูกสร้างขึ้นเพื่อให้เอาต์พุตไม่สามารถแยกความแตกต่างจากบิตแบบสุ่มจริง
DW

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

-1

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

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

ความจริงที่ว่าเครื่องกำเนิดเลขสุ่มหลอกนั้นดีพออยู่ในความจริงที่ว่าพวกเขาทำตาม "ลักษณะพื้นฐานของการสร้างตัวเลขสุ่มหลอก" เพื่อที่จะคำนวณได้อย่างมีประสิทธิภาพและทำตัวเหมือนตัวเลขสุ่มจริง:

  • ตัวเลขที่ผลิตจะต้องเป็นไปตามการแจกแจงแบบเดียวกัน (จากการกระจายนี้คุณสามารถบรรลุการแจกแจงอื่น ๆ );
  • ตัวเลขที่ผลิตจะต้องเป็นอิสระทางสถิติ;
  • ลำดับนั้นทำซ้ำได้ (จุดนี้ถูกกำหนดเพราะคุณสมบัติของฮาร์ดแวร์ของคอมพิวเตอร์คลาสสิคและนั่นเป็นสาเหตุที่พวกเขาถูกเรียกว่า "ตัวเลขสุ่มหลอก");
  • ระยะเวลาของลำดับจะต้องมีขนาดใหญ่พอ
  • การสร้างหมายเลขจะต้องรวดเร็ว

จากแต่ละหมายเลขของลำดับของตัวเลขสุ่มหลอกตัวเลขใหม่จะถูกคำนวณ (โดยปกติเราจะทำงานกับจำนวนเต็ม) อย่างไรก็ตามมีรอบระยะเวลา, n, ในลำดับของตัวสร้างตัวเลขแบบหลอกเทียมที่เตรียมไว้เพื่อทำงานในฐานเฉพาะที่มีจำนวน จำกัด ของบิตที่มีอยู่เพื่อแสดงตัวเลข (เช่นไบนารี) ถ้า n นี้ไม่ใหญ่พอที่จะมีปัญหาร้ายแรง แต่ไม่ต้องกังวลนักวิทยาศาสตร์คอมพิวเตอร์เลือกเมล็ดและพารามิเตอร์อื่น ๆ ของเครื่องกำเนิดไฟฟ้าแบบหลอกเทียมดีเพื่อให้มี n ที่ดี

ตัวอย่างเช่นตัวสร้างตัวเลขแบบสุ่มหลอกที่เป็นไปได้ด้วยวิธีการเชิงเส้นเชิงเส้นซึ่งเป็นหนึ่งในอัลกอริทึมกำเนิดสัญญาณหลอกแบบสุ่มที่เก่าแก่ที่สุดและดีที่สุดที่รู้ว่าสามารถกำหนดตาม:

มันมีค่าสี่ค่า:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0 โดยที่:

x0 คือค่าเริ่มต้น a, c และ m เป็นค่าคงที่โดยที่: m> a, m> c และสร้างลำดับที่มี fornula:

x_ {i + 1} = (a * x_i + c) MOD m

ค่าสำหรับค่าคงที่เหล่านี้จะต้องเลือกอย่างระมัดระวัง ความเป็นไปได้อย่างหนึ่งคือ:

x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32 อ้างอิง [1-2]

มีอัลกอริธึมอื่นที่ซับซ้อนกว่าในการสร้างตัวเลขสุ่มซึ่งหลีกเลี่ยงปัญหาของอัลกอริธึมก่อนหน้าซึ่งรวมถึง: [3]

  • สั้นกว่าระยะเวลาที่คาดไว้สำหรับบางสถานะเมล็ด (เช่นสถานะเมล็ดอาจถูกเรียกว่า 'อ่อนแอ' ในบริบทนี้);
  • ขาดความสม่ำเสมอของการกระจายจำนวนมากสร้างตัวเลข;
  • สหสัมพันธ์ของค่านิยมต่อเนื่อง
  • การกระจายมิติที่ไม่ดีของลำดับเอาต์พุต
  • ระยะห่างระหว่างที่ค่าบางค่าเกิดขึ้นมีการกระจายแตกต่างจากค่าในการแจกแจงแบบสุ่ม

ในอนาคตคอมพิวเตอร์คลาสสิคอาจรวมกันเป็นระบบควอนตัมซึ่งสามารถให้ตัวเลขสุ่มจริง ๆ และส่งมอบให้ [4]

การอ้างอิง:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H. , et al. (1992) "สูตรตัวเลขใน Fortran 77: ศิลปะแห่งการคำนวณทางวิทยาศาสตร์" (2nd ed.) ไอ 0-521-43064-X
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /


นี่ไม่ได้ตอบคำถามจริงๆ คุณอธิบายวิธีสร้างหมายเลขสุ่มไม่ตรวจพบว่า RNG ที่กำหนดนั้นสุ่ม แม้ว่าคำอธิบายของคุณจะค่อนข้างขาดหายไป แต่ความสอดคล้องเชิงเส้นก็แทบจะไม่“ ดีที่สุด” เลย มีฮาร์ดแวร์ RNG อยู่ในขณะนี้ไม่จำเป็นต้องคำนวณควอนตัม มีโอกาสที่ดีที่คุณจะมีหนึ่งในพีซีของคุณหนึ่งในโทรศัพท์ของคุณและแม้กระทั่งหนึ่งในบัตรเครดิตของคุณ
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.