วิธีใดที่ใช้สำหรับทดสอบอัลกอริธึมการสร้างตัวแปรแบบสุ่ม
วิธีใดที่ใช้สำหรับทดสอบอัลกอริธึมการสร้างตัวแปรแบบสุ่ม
คำตอบ:
มิจฉาทิฐิ Test Suiteเป็นสิ่งที่ใกล้เคียงกับมาตรฐานทองคำสำหรับการทดสอบเครื่องกำเนิดไฟฟ้าจำนวนสุ่ม ซึ่งรวมถึงการทดสอบจำนวนหนึ่งที่เครื่องกำเนิดเลขสุ่มที่ดีควรสร้างผลลัพธ์ที่ได้รับการกระจายตามการกระจายที่รู้กันซึ่งผลการใช้เครื่องกำเนิดไฟฟ้าที่ทดสอบนั้นสามารถนำมาเปรียบเทียบ
แก้ไข
ฉันต้องอัปเดตสิ่งนี้เนื่องจากฉันไม่ถูกต้อง: Diehard อาจยังคงใช้งานได้จำนวนมาก แต่ก็ไม่ได้รับการดูแลรักษาอีกต่อไปและไม่ทันสมัยอีกต่อไป NIST มาพร้อมกับชุดการทดสอบที่ปรับปรุงใหม่ตั้งแต่นั้นมา
เพื่อเพิ่มคำตอบเล็กน้อยของชุดทดสอบ Diehard (พัฒนาโดย George Marsaglia) เป็นการทดสอบมาตรฐานสำหรับ PRNG
มีห้องสมุด Diehard Cที่ดีที่ให้คุณเข้าถึงการทดสอบเหล่านี้ได้ เช่นเดียวกับการทดสอบ Diehard มาตรฐานมันยังมีฟังก์ชั่นสำหรับการทดสอบ PRNG อื่น ๆ ที่เกี่ยวข้องกับการตรวจสอบลำดับบิต นอกจากนี้ยังมีสิ่งอำนวยความสะดวกสำหรับการทดสอบความเร็วของ RNG และการเขียนการทดสอบของคุณเอง
มีอินเตอร์เฟส R ไปยังไลบรารีDieharderเรียกว่าRDieHarder :
library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)
Diehard Count the 1s Test (byte)
data: Created by RNG `randu' with seed=12345,
sample of size 100 p-value < 2.2e-16
นี่แสดงให้เห็นว่าเครื่องกำเนิดRANDU RNG ล้มเหลวในการทดสอบระยะทางขั้นต่ำ / 2dsphere
สำหรับการทดสอบตัวเลขที่ผลิตโดยเครื่องกำเนิดตัวเลขสุ่มการทดสอบ Diehardนั้นเป็นวิธีการปฏิบัติ แต่การทดสอบเหล่านั้นดูเหมือนเป็นการสุ่มและอาจจะเหลือสงสัยว่าควรรวมมากกว่าหรือถ้ามีวิธีใดที่จะตรวจสอบการสุ่ม
ผู้สมัครที่ดีที่สุดสำหรับความหมายของลำดับสุ่มน่าจะเป็นแบบแผนมาร์ตินLöf แนวคิดหลักสำหรับการสุ่มแบบนี้ได้รับการพัฒนาอย่างสวยงามในKnuth, ส่วนที่ 3.5เพื่อทดสอบความสม่ำเสมอของลำดับย่อยทุกประเภทของลำดับตัวเลขสุ่ม การได้นิยามนิยามของทุกประเภทกลายเป็นเรื่องยากจริงๆแม้ว่าจะใช้ความคิดในการคำนวณ
การทดสอบมิจฉาทิฐิเป็นเพียงตัวอย่างหนึ่งที่เป็นไปได้ที่อาจพิจารณาและความล้มเหลวของพวกเขาจะไม่รวมการสุ่มของมาร์ติน - โลฟ
คุณไม่สามารถพิสูจน์ได้เพราะเป็นไปไม่ได้ คุณสามารถตรวจสอบได้ว่าไม่มีความสัมพันธ์ที่น่าอับอายหรือการรบกวนการแจกจ่ายหรือไม่และแน่นอนว่าDiehardเป็นมาตรฐานสำหรับมัน นี่คือสถิติ / ฟิสิกส์ผู้เข้ารหัสลับจะตรวจสอบส่วนใหญ่ (เหนือสิ่งอื่นใด) ว่ามันยากขนาดไหนที่จะทำให้เครื่องกำเนิดไฟฟ้าเข้ากับข้อมูลเพื่อรับค่าในอนาคต
การแก้ไขเล็กน้อยเพื่อโพสต์ของ Colin: แพคเกจ CRAN RDieHarderเป็นอินเทอร์เฟซสำหรับ DieHarder , Diehard rewrite / extension / overhaul ทำโดยRobert G. Brown (ที่กรุณาแสดงให้ฉันเป็น coauthor ที่อยู่บน wraps RDieHarder ของฉัน) โดย David Bauer
เหนือสิ่งอื่นใด DieHarder รวมแบตเตอรี่ NIST ของการทดสอบที่กล่าวถึงในการโพสต์ของ Mark รวมถึงการทดสอบใหม่ นี่คือการวิจัยอย่างต่อเนื่องและได้รับในขณะที่ ฉันได้พูดคุยที่ useR! 2007 เกี่ยวกับ RDieHarder ที่คุณจะได้รับจากที่นี่
มันไม่ค่อยมีประโยชน์ที่จะสรุปว่ามีบางสิ่งที่ "สุ่ม" ในนามธรรม บ่อยครั้งที่คุณต้องการทดสอบว่ามีโครงสร้างแบบสุ่มหรือไม่ ตัวอย่างเช่นคุณอาจต้องการทดสอบว่ามีบางอย่างที่มีการแจกแจงแบบเดียวกันโดยมีค่าทั้งหมดในช่วงที่แน่นอนเท่ากันหรือไม่ หรือคุณอาจต้องการทดสอบว่ามีบางอย่างที่มีการแจกแจงแบบปกติหรือไม่หากต้องการทดสอบว่าข้อมูลมีการกระจายเฉพาะคุณสามารถใช้การทดสอบแบบพอดีเช่นการทดสอบไคสแควร์หรือการทดสอบ Kolmogorov-Smirnov
มีสองส่วนในการทดสอบเครื่องกำเนิดตัวเลขสุ่ม หากคุณกังวลเกี่ยวกับการทดสอบเครื่องกำเนิดไฟฟ้าแบบสม่ำเสมอเท่านั้นใช่แล้วชุดทดสอบ DIEHARD เป็นความคิดที่ดี
แต่บ่อยครั้งที่คุณต้องทดสอบการเปลี่ยนแปลงของชุดเครื่องกำเนิดไฟฟ้า ตัวอย่างเช่นคุณอาจใช้เครื่องกำเนิดไฟฟ้าที่เหมือนกันในการสร้างค่าที่ชี้แจงหรือกระจายตามปกติ คุณอาจมีตัวกำเนิดชุดคุณภาพสูง - สมมติว่าคุณมีการใช้อัลกอริทึมที่รู้จักกันดีเช่น Mersenne Twister ที่เชื่อถือได้ แต่คุณต้องทดสอบว่าเอาต์พุตที่แปลงแล้วมีการกระจายที่ถูกต้องหรือไม่ ในกรณีนี้คุณต้องทำการทดสอบความพอดีเช่น Kolmogorov-Smirnov แต่สำหรับผู้เริ่มคุณสามารถตรวจสอบว่าค่าเฉลี่ยและความแปรปรวนตัวอย่างมีค่าที่คุณคาดหวัง
คนส่วนใหญ่ไม่ได้ - และไม่ควร - เขียนเครื่องกำเนิดตัวเลขสุ่มของตัวเองตั้งแต่เริ่มต้น มันยากที่จะเขียนตัวกำเนิดที่ดีและง่ายต่อการหลอกตัวเองให้คิดว่าคุณได้เขียนตัวที่ดีเมื่อคุณไม่ได้ ตัวอย่างเช่น Donald Knuth บอกเล่าเรื่องราวในTAOCP เล่มที่ 2ของตัวสร้างตัวเลขสุ่มที่เขาเขียนซึ่งกลายเป็นแย่มาก แต่มันเป็นเรื่องธรรมดาสำหรับคนที่จะต้องเขียนโค้ดของตัวเองเพื่อสร้างค่าสุ่มจากการแจกแจงใหม่
NIST เผยแพร่รายการของการทดสอบทางสถิติกับการดำเนินการอ้างอิงใน C.
นอกจากนี้ยังมีTestU01โดยสมาร์ทโฟนบางคนซึ่งรวมถึงนักวิจัย PRNG ที่มีชื่อเสียง Pierre L'Ecuyer มีการนำการอ้างอิงไปใช้ใน C อีกครั้ง
ตามที่ผู้วิจารณ์คนอื่นชี้ให้เห็นสิ่งเหล่านี้มีไว้สำหรับการทดสอบการสร้างบิตสุ่มหลอก หากคุณแปลงบิตเหล่านี้เป็นตัวแปรสุ่มอื่น (เช่นการแปลง Box-Muller จากเครื่องแบบเป็นปกติ) คุณจะต้องทดสอบเพิ่มเติมเพื่อยืนยันความถูกต้องของอัลกอริทึมการแปลง