กลับไปหน้าบทความ

อ่าน 9 นาที

ไม่มีชื่อบทความ

เครื่อง กำเนิดเลขสุ่มเทียม ( PRNG ) หรือที่รู้จักกันในชื่อ เครื่องกำเนิดบิตสุ่มแบบกำหนด ( DRBG ) [ 1 ] เป็น อัลกอริทึม...

เครื่องกำเนิดเลขสุ่มเทียม

เครื่องกำเนิดเลขสุ่มเทียม ( PRNG ) หรือที่รู้จักกันในชื่อเครื่องกำเนิดบิตสุ่มแบบกำหนด ( DRBG ) [ 1 ]เป็นอัลกอริทึมสำหรับการสร้างลำดับของตัวเลขที่มีคุณสมบัติใกล้เคียงกับคุณสมบัติของลำดับของตัวเลขสุ่ม ลำดับที่สร้างโดย PRNG ไม่ใช่เลขสุ่ม อย่างแท้จริง เนื่องจากถูกกำหนดโดยค่าเริ่มต้นที่เรียกว่าseed ของ PRNG (ซึ่งอาจรวมถึงค่าสุ่มอย่างแท้จริง) แม้ว่าลำดับที่ใกล้เคียงกับเลขสุ่มอย่างแท้จริงจะสามารถสร้างได้โดยใช้เครื่องกำเนิดเลขสุ่มแบบฮาร์ดแวร์แต่เครื่องกำเนิดเลขสุ่มเทียมมีความสำคัญในทางปฏิบัติเนื่องจากความเร็วในการสร้างตัวเลขและความสามารถในการทำซ้ำ[ 2 ]

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

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

ปัญหาที่อาจเกิดขึ้น

ในทางปฏิบัติ ผลลัพธ์จากตัวสร้างเลขสุ่มเทียม (PRNG) ทั่วไปหลายตัวแสดงสิ่งผิดปกติที่ทำให้ไม่ผ่านการทดสอบการตรวจจับรูปแบบทางสถิติ ซึ่งได้แก่:

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

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

ในหลายสาขา งานวิจัยก่อนศตวรรษที่ 21 ที่อาศัยการเลือกแบบสุ่มหรือ การจำลอง มอนเตคาร์โลหรืออาศัย PRNG ในรูปแบบอื่น ๆ นั้นมีความน่าเชื่อถือน้อยกว่าอุดมคติเนื่องจากการใช้ PRNG คุณภาพต่ำ[ 4 ]แม้แต่ในปัจจุบัน บางครั้งก็ยังต้องระมัดระวัง ดังที่แสดงให้เห็นโดยคำเตือนต่อไปนี้ในสารานุกรมวิทยาศาสตร์สถิติระหว่างประเทศ (2010) [ 5 ]

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

เพื่อเป็นตัวอย่าง ลองพิจารณาภาษาการเขียนโปรแกรมJava ที่ใช้กันอย่างแพร่หลาย จนถึงปี 2020 Java ยังคงใช้ตัวสร้างเชิงเส้นแบบสอดคล้อง (LCG) สำหรับ PRNG [ 6 ] [ 7 ]ซึ่งมีคุณภาพต่ำ (ดูรายละเอียดเพิ่มเติมด้านล่าง) การสนับสนุน Java ได้รับการอัปเกรดด้วยJava 17

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

ตัวสร้างที่อิงตามความสัมพันธ์เวียนเกิดเชิงเส้น

ในช่วงครึ่งหลังของศตวรรษที่ 20 กลุ่มอัลกอริธึมมาตรฐานที่ใช้สำหรับ PRNG ประกอบด้วยตัวสร้างเชิงเส้นแบบคอนกรุเอทีฟ คุณภาพของ LCG เป็นที่ทราบกันดีว่าไม่เพียงพอ แต่ยังไม่มีวิธีการที่ดีกว่า Press et  al. (2007) อธิบายผลลัพธ์ดังนี้: "หากเอกสารทางวิทยาศาสตร์ทั้งหมดที่มีผลลัพธ์ที่น่าสงสัยเนื่องจาก [LCG และที่เกี่ยวข้อง] หายไปจากชั้นวางหนังสือในห้องสมุด จะมีช่องว่างบนชั้นวางแต่ละชั้นขนาดเท่ากำมือของคุณ" [ 8 ]

ความก้าวหน้าครั้งสำคัญในการสร้างตัวสร้างเลขสุ่มเทียมคือการนำเทคนิคที่อิงตามความสัมพันธ์เวียนเกิดเชิงเส้นบนฟิลด์สององค์ประกอบมาใช้ ตัวสร้างดังกล่าวมีความเกี่ยวข้องกับรีจิสเตอร์เลื่อนป้อนกลับเชิงเส้น

โดยเฉพาะอย่างยิ่ง การประดิษฐ์Mersenne Twister ในปี 1997 [ 9 ] ได้หลีกเลี่ยงปัญหาหลายประการของตัวสร้างก่อนหน้านี้ Mersenne Twister มีคาบการวนซ้ำ 2 19  937  1 (≈  4.3 × 10(6001 ) ได้รับการพิสูจน์แล้วว่ามีการกระจายอย่างสม่ำเสมอในมิติ (สูงสุด) 623 มิติ (สำหรับค่า 32 บิต) และในขณะที่เปิดตัวนั้นทำงานได้เร็วกว่าเครื่องกำเนิดอื่นๆ ที่สมเหตุสมผลทางสถิติ

ในปี พ.ศ. 2546 George Marsagliaได้แนะนำตระกูลเครื่องกำเนิดxorshift [ 10 ]ซึ่งอิงตามความสัมพันธ์เวียนเกิดเชิงเส้นอีกครั้ง เครื่องกำเนิดดังกล่าวทำงานได้อย่างรวดเร็วมาก และเมื่อรวมกับการดำเนินการแบบไม่เชิงเส้นแล้ว จะผ่านการทดสอบทางสถิติที่เข้มงวด[ 11 ] [ 12 ] [ 13 ]

ในปี พ.ศ. 2549 ได้มีการพัฒนาตระกูลเครื่องกำเนิดWELL ขึ้น [ 14 ]เครื่องกำเนิด WELL ในบางแง่มุมช่วยปรับปรุงคุณภาพของ Mersenne Twister ซึ่งมีปริภูมิสถานะที่ใหญ่เกินไปและการกู้คืนจากปริภูมิสถานะที่มีศูนย์จำนวนมากได้ช้ามาก

ตัวสร้างเลขสุ่มแบบนับจำนวน

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

 เอาต์พุต =เอฟ(n, สำคัญ){\displaystyle {\text{ output }}=f(n,{\text{ key}})}

โดยทั่วไปจะใช้สำหรับการสร้างตัวเลขสุ่มเทียมสำหรับการคำนวณแบบขนานขนาดใหญ่ เช่น บนคลัสเตอร์ GPU หรือ CPU [ 15 ]พวกมันมีข้อดีบางประการ:

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

ตัวอย่างได้แก่: [ 15 ]

  • Philox: ใช้การผสมแบบอิงการคูณเพื่อรวมตัวนับและคีย์เข้าด้วยกัน
  • ทรีฟรีย์: พัฒนาขึ้นจาก รหัสลับแบบบล็อกทรีฟิชเวอร์ชันลดความแข็งแกร่งลง

ตัวสร้างเลขสุ่มเทียมแบบเข้ารหัสลับ

PRNG ที่เหมาะสมสำหรับ การใช้งาน ด้านการเข้ารหัสเรียกว่าPRNG ที่ปลอดภัยทางด้านการเข้ารหัส (CSPRNG) ข้อกำหนดสำหรับ CSPRNG คือฝ่ายตรงข้ามที่ไม่ทราบ seed จะมีข้อได้เปรียบ เพียง เล็กน้อย ในการแยกแยะลำดับเอาต์พุตของตัวสร้างจากลำดับสุ่ม กล่าวอีกนัยหนึ่ง ในขณะที่ PRNG จำเป็นต้องผ่านการทดสอบทางสถิติบางอย่างเท่านั้น แต่ CSPRNG ต้องผ่านการทดสอบทางสถิติทั้งหมดที่จำกัดไว้ที่เวลาพหุนามตามขนาดของ seed แม้ว่าการพิสูจน์คุณสมบัตินี้จะเกินขอบเขตของทฤษฎีความซับซ้อนของการคำนวณ ในปัจจุบัน แต่หลักฐานที่แข็งแกร่งอาจได้รับจากการลดรูปเป็น CSPRNG จากปัญหาที่ถือว่ายากเช่นการแยกตัวประกอบจำนวนเต็ม[ 16 ]โดยทั่วไป อาจต้องใช้เวลาหลายปีในการตรวจสอบก่อนที่อัลกอริทึมจะได้รับการรับรองว่าเป็น CSPRNG

CSPRNG บางประเภทมีดังต่อไปนี้:

มีการแสดงให้เห็นแล้วว่าNSAน่าจะแทรกแบ็กดอร์ แบบอสมมาตร เข้าไปในเครื่องกำเนิดเลขสุ่มเทียมDual_EC_DRBGที่ ได้รับการรับรองจาก NIST [ 20 ]

อัลกอริทึม PRNG ส่วนใหญ่สร้างลำดับที่มีการกระจายอย่างสม่ำเสมอโดยการทดสอบหลายอย่าง คำถามที่ยังเปิดอยู่ และเป็นประเด็นสำคัญในทฤษฎีและการปฏิบัติของการเข้ารหัสลับว่ามีวิธีใดที่จะแยกแยะผลลัพธ์ของ PRNG คุณภาพสูงออกจากลำดับสุ่มที่แท้จริงได้หรือไม่ ในสถานการณ์นี้ ตัวแยกแยะจะรู้ว่ามีการใช้อัลกอริทึม PRNG ที่รู้จัก (แต่ไม่ใช่สถานะที่เริ่มต้น) หรือใช้อัลกอริทึมสุ่มที่แท้จริง และต้องแยกแยะระหว่างทั้งสอง[ 21 ]ความปลอดภัยของอัลกอริทึมและโปรโตคอลการเข้ารหัสลับส่วนใหญ่ที่ใช้ PRNG ขึ้นอยู่กับสมมติฐานที่ว่าเป็นไปไม่ได้ที่จะแยกแยะการใช้ PRNG ที่เหมาะสมออกจากการใช้ลำดับสุ่มที่แท้จริง ตัวอย่างที่ง่ายที่สุดของการพึ่งพานี้คือการเข้ารหัสแบบสตรีมซึ่ง (ส่วนใหญ่) ทำงานโดยการใช้การดำเนินการ OR พิเศษ กับ ข้อความธรรมดาของข้อความกับผลลัพธ์ของ PRNG ทำให้เกิดข้อความเข้ารหัสลับการออกแบบ PRNG ที่เพียงพอต่อการเข้ารหัสลับนั้นยากมาก เพราะต้องเป็นไปตามเกณฑ์เพิ่มเติม ขนาดของช่วงเวลาเป็นปัจจัยสำคัญในความเหมาะสมทางด้านการเข้ารหัสของ PRNG แต่ไม่ใช่ปัจจัยเดียว

เกณฑ์การประเมินของ BSI

สำนักงานความปลอดภัยข้อมูลแห่งสหพันธรัฐเยอรมนี( ภาษาเยอรมัน: Bundesamt für Sicherheit in der Informationstechnik , BSI) ได้กำหนดเกณฑ์สี่ประการสำหรับคุณภาพของเครื่องกำเนิดเลขสุ่มแบบกำหนด[ 22 ]โดยสรุปได้ดังนี้:

  • K1 – ลำดับของตัวเลขสุ่มที่สร้างขึ้นควรมีความน่าจะเป็นสูงที่จะแตกต่างกันออกไป
  • K2 – ลำดับของตัวเลขไม่สามารถแยกแยะได้จากตัวเลข "สุ่มอย่างแท้จริง" ตามการทดสอบทางสถิติที่กำหนด การทดสอบเหล่านี้ได้แก่ การทดสอบ โมโนบิต (จำนวนหนึ่งและศูนย์เท่ากันในลำดับ) การทดสอบ โป๊กเกอร์ (กรณีพิเศษของการทดสอบไคกำลังสอง ) การทดสอบ รัน (นับความถี่ของรันที่มีความยาวต่างๆ) การทดสอบ ลองรัน (ตรวจสอบว่ามีรันที่มีความยาว 34 หรือมากกว่าใน 20,000 บิตของลำดับหรือไม่) ทั้งจากBSI [ 22 ] และ NIST [ 23 ]และการทดสอบออโตสหสัมพันธ์โดยพื้นฐานแล้ว ข้อกำหนดเหล่านี้เป็นการทดสอบว่าลำดับบิตนั้นมีดีเพียงใด: มีศูนย์และหนึ่งบ่อยเท่ากัน; หลังจากลำดับของ ศูนย์ (หรือหนึ่ง) nตัว บิตถัดไปจะเป็นหนึ่ง (หรือศูนย์) ด้วยความน่าจะเป็นหนึ่งในสอง; และลำดับย่อย ที่เลือกใดๆ จะไม่มีข้อมูลเกี่ยวกับองค์ประกอบถัดไปในลำดับ
  • K3 – ผู้โจมตีไม่ควรสามารถคำนวณหรือคาดเดาค่าใดๆ ในลำดับย่อยใดๆ หรือค่าในอนาคตของลำดับนั้น รวมถึงสถานะภายในของตัวสร้างลำดับได้ (ในทางปฏิบัติ)
  • K4 – ในทางปฏิบัติแล้ว เป็นไปไม่ได้เลยที่ผู้โจมตีจะคำนวณหรือเดาตัวเลขก่อนหน้าในลำดับหรือสถานะภายในของตัวสร้างตัวเลขนั้นได้

สำหรับการใช้งานด้านการเข้ารหัสลับ จะยอมรับเฉพาะตัวสร้างรหัสที่ตรงตามมาตรฐาน K3 หรือ K4 เท่านั้น

นิยามทางคณิตศาสตร์

ที่ให้ไว้:

  • พี{\displaystyle P}– การกระจายความน่าจะเป็นบน(อาร์,บี){\displaystyle \left(\mathbb {R} ,{\mathfrak {B}}\right)}(ที่ไหนบี{\displaystyle {\mathfrak {B}}}(คือซิกมาแอลเจบรา ของ เซตย่อยบอเรลทั้งหมดของเส้นจำนวนจริง)
  • เอฟ{\displaystyle {\mathfrak {F}}}– ชุดเหรียญโบเรลที่ไม่ว่างเปล่าเอฟบี{\displaystyle {\mathfrak {F}}\subseteq {\mathfrak {B}}}เช่นเอฟ={(,ที]:ทีอาร์}{\displaystyle {\mathfrak {F}}=\left\{\left(-\infty ,t\right]:t\in \mathbb {R} \right\}}. ถ้าเอฟ{\displaystyle {\mathfrak {F}}}หากไม่ได้ระบุไว้ อาจเป็นอย่างใดอย่างหนึ่งก็ได้บี{\displaystyle {\mathfrak {B}}}หรือ{(,ที]:ทีอาร์}{\displaystyle \left\{\left(-\infty ,t\right]:t\in \mathbb {R} \right\}}ขึ้นอยู่กับบริบท
  • เออาร์{\displaystyle A\subseteq \mathbb {R} }– เซตที่ไม่ว่างเปล่า (ไม่จำเป็นต้องเป็นเซตโบเรล) บ่อยครั้งเอ{\displaystyle A}เป็นเซตระหว่างพี{\displaystyle P}ส่วนรองรับและส่วนภายใน ของมัน ตัวอย่างเช่น ถ้าพี{\displaystyle P}คือการแจกแจงแบบเอกรูปบนช่วง(0,1]{\displaystyle \left(0,1\right]},เอ{\displaystyle A}อาจจะเป็น(0,1]{\displaystyle \left(0,1\right]}. ถ้าเอ{\displaystyle A}หากไม่ได้ระบุไว้ จะถือว่าเป็นเซตบางเซตที่อยู่ในขอบเขตการสนับสนุนของพี{\displaystyle P}และครอบคลุมส่วนภายในของสิ่งนั้น ขึ้นอยู่กับบริบท

เราเรียกฟังก์ชันว่าเอฟ:เอ็น1อาร์{\displaystyle f:\mathbb {N} _{1}\rightarrow \mathbb {R} }(ที่ไหนเอ็น1={1,2,3,}{\displaystyle \mathbb {N} _{1}=\left\{1,2,3,\dots \right\}}(คือเซตของจำนวนเต็มบวก) ตัวสร้างเลขสุ่มเทียมสำหรับพี{\displaystyle P}ที่ให้ไว้เอฟ{\displaystyle {\mathfrak {F}}}การนำค่าต่างๆ มาใช้เอ{\displaystyle A}ก็ต่อเมื่อ :

  • เอฟ(เอ็น1)เอ{\displaystyle f\left(\mathbb {N} _{1}\right)\subseteq A}
  • อีเอฟε>0เอ็นเอ็น1nเอ็น,|#{ฉัน{1,2,,n}:เอฟ(ฉัน)อี}nพี(อี)|<ε{\displaystyle \forall E\in {\mathfrak {F}}\quad \forall \varepsilon >0\quad \exists N\in \mathbb {N} _{1}\quad \forall n\geq N,\quad \left|{\frac {\#\left\{i\in \left\{1,2,\dots ,n\right\}:f(i)\in E\right\}}{n}}-P(E)\right|<\varepsilon }

(#เอส{\displaystyle \#S}แสดงถึงจำนวนองค์ประกอบในเซตจำกัดเอส{\displaystyle S}.)

สามารถแสดงได้ว่าถ้าเอฟ{\displaystyle f}เป็นตัวสร้างเลขสุ่มเทียมสำหรับการแจกแจงแบบเอกรูปบน(0,1){\displaystyle \left(0,1\right)}และถ้าเอฟ{\displaystyle F}คือ ฟังก์ชันการกระจาย สะสม (CDF)ของการแจกแจงความน่าจะเป็นที่กำหนดให้พี{\displaystyle P}, แล้วเอฟ*เอฟ{\displaystyle F^{*}\circ f}เป็นตัวสร้างเลขสุ่มเทียมสำหรับพี{\displaystyle P}, ที่ไหนเอฟ*:(0,1)อาร์{\displaystyle F^{*}:\left(0,1\right)\rightarrow \mathbb {R} }คือเปอร์เซ็นไทล์ของพี{\displaystyle P}, เช่นเอฟ*(x):=ข้อมูล{ทีอาร์:xเอฟ(ที)}{\displaystyle F^{*}(x):=\inf \left\{t\in \mathbb {R} :x\leq F(t)\right\}}โดยสัญชาตญาณแล้ว การกระจายแบบใดๆ ก็สามารถจำลองได้จากการจำลองการกระจายแบบเอกรูปมาตรฐาน

แนวทางเบื้องต้น

เครื่องกำเนิดตัวเลขสุ่มเทียม (PRNG) รุ่นแรกๆ ที่ใช้คอมพิวเตอร์ ซึ่งเสนอโดยจอห์น ฟอน นอยมันน์ในปี 1946 เรียกว่าวิธีการกำลังสองกลาง (middle-square method ) อัลกอริทึมมีดังนี้: นำตัวเลขใดๆ มายกกำลังสอง ลบตัวเลขตรงกลางของตัวเลขที่ได้ออกมาเป็น "ตัวเลขสุ่ม" จากนั้นใช้ตัวเลขนั้นเป็นค่าเริ่มต้น (seed) สำหรับการทำซ้ำครั้งต่อไป ตัวอย่างเช่น การยกกำลังสองของตัวเลข "1111" จะได้ "1234321" ซึ่งสามารถเขียนได้เป็น "01234321" ซึ่งเป็นตัวเลข 8 หลักที่เป็นกำลังสองของตัวเลข 4 หลัก ดังนั้นจะได้ "2343" เป็นตัวเลขสุ่ม การทำซ้ำขั้นตอนนี้จะได้ "4896" เป็นผลลัพธ์ถัดไป และต่อไปเรื่อยๆ ฟอน นอยมันน์ใช้ตัวเลข 10 หลัก แต่กระบวนการก็เหมือนกัน

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

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

วิธีการสร้างช่องสี่เหลี่ยมตรงกลางได้ถูกแทนที่ด้วยตัวสร้างที่ซับซ้อนกว่าในภายหลัง

นวัตกรรมล่าสุดคือการรวมช่องสี่เหลี่ยมตรงกลางเข้ากับลำดับ Weylวิธีนี้สร้างผลลัพธ์คุณภาพสูงได้ตลอดช่วงเวลาที่ยาวนาน (ดูวิธีช่องสี่เหลี่ยมตรงกลาง )

เครื่องกำเนิดไฟฟ้าที่ไม่สม่ำเสมอ

ตัวเลขที่เลือกจาก1การแจกแจงความน่าจะเป็นที่ไม่สม่ำเสมอ สามารถสร้างขึ้นได้โดยใช้ PRNG ที่แจกแจงแบบสม่ำเสมอและฟังก์ชันที่เชื่อมโยงการแจกแจงทั้งสองเข้าด้วยกัน

ขั้นแรก จำเป็นต้องมีฟังก์ชันการกระจายสะสมเอฟ(){\displaystyle F(b)}ของการกระจายเป้าหมายเอฟ(){\displaystyle f(b)}:

เอฟ()=เอฟ(){\displaystyle F(b)=\int _{-\infty }^{b}f(b')\,db'}

โปรดทราบว่า0=เอฟ()เอฟ()เอฟ()=1{\displaystyle 0=F(-\infty )\leq F(b)\leq F(\infty )=1}เมื่อใช้เลขสุ่มcจากการแจกแจงแบบเอกรูปเป็นความหนาแน่นของความน่าจะเป็นที่จะ "ผ่านไป" เราจะได้

เอฟ()={\displaystyle F(b)=c}

ดังนั้น

=เอฟ1(){\displaystyle b=F^{-1}(c)}

เป็นตัวเลขที่สุ่มเลือกมาจากการแจกแจงเอฟ(){\displaystyle f(b)}นี่คือการสุ่มตัวอย่างโดยใช้การแปลงผกผัน

ตัวอย่างเช่น ค่าผกผันของการกระจายแบบเกาส์เซียน สะสมเอิร์ฟ1(x){\displaystyle \operatorname {erf} ^{-1}(x)}โดยใช้ PRNG ที่เป็นเอกรูปในอุดมคติที่มีช่วง (0, 1) เป็นอินพุตx{\displaystyle x}จะสร้างลำดับของค่า (บวกเท่านั้น) ที่มีการกระจายแบบเกาส์เซียน อย่างไรก็ตาม

  • เมื่อใช้ การแสดง ตัวเลขเชิงปฏิบัติ ค่า "ส่วนหาง" ที่ไม่มีที่สิ้นสุดของการกระจายจะต้องถูกตัดให้เหลือค่าจำกัด
  • การคำนวณซ้ำๆ ของเอิร์ฟ1(x){\displaystyle \operatorname {erf} ^{-1}(x)}ควรลดขนาดลงด้วยวิธีการต่างๆ เช่นอัลกอริทึมซิกกูแรตเพื่อให้สร้างข้อมูลได้เร็วขึ้น

หลักการที่คล้ายกันนี้สามารถนำไปใช้กับการสร้างการแจกแจงที่ไม่สม่ำเสมออื่นๆ เช่นการแจกแจงแบบเรย์ลีและการแจกแจงแบบปัวซงได้เช่นกัน

ดูเพิ่มเติม

บรรณานุกรม

  • Barker E., Kelsey J. , คำแนะนำสำหรับการสร้างเลขสุ่มโดยใช้ตัวสร้างบิตสุ่มแบบกำหนดค่าได้ , NIST SP800-90A, มกราคม 2012
  • Brent RP , "เครื่องกำเนิดเลขสุ่มระยะยาวบางประเภทโดยใช้การเลื่อนและการ XOR", ANZIAM Journal , 2007; 48:C188–C202
  • Gentle JE (2003), การสร้างตัวเลขสุ่มและวิธีการมอนเตคาร์โล , Springer.
  • Hörmann W., Leydold J., Derflinger G. (2004, 2011), การสร้างตัวแปรสุ่มที่ไม่สม่ำเสมอโดยอัตโนมัติ , Springer-Verlag.
  • Knuth DE. ศิลปะแห่งการเขียนโปรแกรมคอมพิวเตอร์เล่ม 2: อัลกอริทึมกึ่งตัวเลขฉบับพิมพ์ครั้งที่ 3 สำนักพิมพ์ Addison-Wesley, 1997. ISBN 0-201-89684-2บทที่ 3 [ครอบคลุมรายละเอียดอย่างครบถ้วนเกี่ยวกับการทดสอบทางสถิติเพื่อตรวจสอบว่าข้อมูลนั้นไม่ได้เกิดขึ้นโดยสุ่ม]
  • Luby M., ความสุ่มเทียมและการประยุกต์ใช้ทางด้านการเข้ารหัส , สำนักพิมพ์มหาวิทยาลัยพรินซ์ตัน, 1996. ISBN 9780691025469
  • von Neumann J., "เทคนิคต่างๆ ที่ใช้ร่วมกับตัวเลขสุ่ม" ใน AS Householder, GE Forsythe และ HH Germond, บรรณาธิการ, วิธีมอนเตคาร์โล , ชุดคณิตศาสตร์ประยุกต์ของสำนักงานมาตรฐานแห่งชาติ, 12 (วอชิงตัน ดี.ซี.: สำนักงานพิมพ์ของรัฐบาลสหรัฐอเมริกา, 1951): 36–38
  • ปีเตอร์สัน, ไอวาร์ส (1997). ป่าแห่งความสุ่ม : การผจญภัยทางคณิตศาสตร์ . นิวยอร์ก: จอห์น ไวลีย์ แอนด์ ซันส์. ISBN 0-471-16449-6.
  • Press WH, Teukolsky SA, Vetterling WT, Flannery BP (2007), Numerical Recipes ( Cambridge University Press ).
  • Viega J. , " การสร้างเลขสุ่มเชิงปฏิบัติในซอฟต์แวร์ ", ใน Proc. 19th Annual Computer Security Applications Conference, ธันวาคม 2003.
  • TestU01 : ชุดทดสอบการสร้างตัวเลขสุ่มด้วยภาษาC++ที่ทันสมัยและใช้งานได้ฟรี ( GPL )
  • DieHarder : ชุดทดสอบตัวเลขสุ่มภาษาCฟรี ( GPL )
  • " การสร้างเลขสุ่ม " (ในระบบฝังตัว ) โดย เอริค อูเนอร์ (2004)
  • " การวิเคราะห์ตัวสร้างเลขสุ่มของลินุกซ์ " โดย Zvi Gutterman, Benny Pinkas และ Tzachy Reinman (2006)
  • " Better pseudorandom Generators " โดย Parikshit Gopalan, Raghu Meka, Omer Reingold , Luca TrevisanและSalil Vadhan ( Microsoft Research , 2012)
  • rand() ถูกมองว่าเป็นอันตรายบนYouTubeโดย Stephan Lavavej (Microsoft, 2013)
  • Wsphynxเป็นโปรแกรมสร้างเลขสุ่มแบบออนไลน์ที่ใช้งานง่าย เลขสุ่มจะถูกสร้างขึ้นโดยอัลกอริธึมตัวสร้างเลขสุ่มเทียม (PRNG) ของ JavaScript

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ไม่มีชื่อบทความ

เครื่อง กำเนิดเลขสุ่มเทียม ( PRNG ) หรือที่รู้จักกันในชื่อ เครื่องกำเนิดบิตสุ่มแบบกำหนด ( DRBG ) [ 1 ] เป็น อัลกอริทึม...

ปัญหาที่อาจเกิดขึ้น

ในทางปฏิบัติ ผลลัพธ์จากตัวสร้างเลขสุ่มเทียม (PRNG) ทั่วไปหลายตัวแสดง สิ่งผิดปกติ ที่ทำให้ไม่ผ่านการทดสอบการตรวจจับรูปแบบทางสถิติ ซึ่งได้แก่:

ตัวสร้างที่อิงตามความสัมพันธ์เวียนเกิดเชิงเส้น

ในช่วงครึ่งหลังของศตวรรษที่ 20 กลุ่มอัลกอริธึมมาตรฐานที่ใช้สำหรับ PRNG ประกอบด้วย ตัวสร้างเชิงเส้นแบบคอนกรุเอที ฟ คุณภาพของ LCG เป็นที่ทราบกันดีว่าไม่เพียงพอ แต่ยังไม่มีวิธีการที่ดีกว่า Press et al.

ตัวสร้างเลขสุ่มแบบนับจำนวน

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