แรงบันดาลใจจากการสุ่มด้วยมือของคุณผูก :
เป้าหมาย
เป้าหมายของความท้าทายนี้คือการเขียนโปรแกรมที่สร้างกระแสบิตหลอกซึ่งเป็นสตริงของ 1s และ 0s ที่ดูเหมือนจะสุ่มล้วนๆ แต่ถูกสร้างขึ้นในลักษณะที่กำหนดขึ้นจริง โปรแกรมของคุณควรส่งออกสตริงที่ 1 และ 0 (พร้อมช่องว่างเสริม) และควรผ่านข้อกำหนดต่อไปนี้:
- ให้เวลาและหน่วยความจำไม่ จำกัด โปรแกรมของคุณจะต้องส่งออกสตริง 1s และ 0s ตลอดไป
- โปรแกรมของคุณจะต้องส่งออกมากกว่า 1,000 บิตสุ่มในเวลาประมาณหนึ่งนาทีบนเครื่องที่เหมาะสม หากข้อกำหนดนี้เป็นไปไม่ได้ฉันจะลดให้น้อยลง
- สตริงของบิตสามารถทำซ้ำได้ แต่ความยาวของส่วนการทำซ้ำต้องมากกว่า 1,000 บิต
- สตริงของบิตต้องผ่านการทดสอบแบบสุ่มมากที่สุด (อธิบายไว้ด้านล่าง) เท่าที่จะทำได้
- โปรแกรมจะต้องไม่รับอินพุตใด ๆ จากแหล่งภายนอกหรือใช้ฟังก์ชั่นใด ๆ ในตัวแรนด์ ()
- เนื่องจากข้อกำหนดข้างต้นโปรแกรมจะต้องส่งออกสตริงที่แน่นอนของบิตในแต่ละครั้งที่รัน
การทดสอบแบบสุ่ม # 1
สตริงของบิตเทียมจะต้องไม่มีรูปแบบที่ชัดเจนใด ๆ เมื่อตรวจสอบด้วยสายตา
การทดสอบแบบสุ่ม # 2 (อาจมีการเปลี่ยนแปลงตามความคิดเห็น)
สตริงของบิตต้องมีการแจกแจงเท่ากับ 1 และ 0 การทดสอบนี้ (และสิ่งอื่น ๆ ด้วย) กระแสของบิตจะถูกแบ่งออกเป็นกลุ่มที่มี 3 101|111|001
บิตยาวเช่น
จากกลุ่มทั้งหมดเหล่านี้ 1/8 ของพวกเขาควรมีสาม 1s และไม่มี 0s, 3/8 ของพวกเขาควรมีสอง 1 วินาทีและหนึ่ง 0, 3/8 ของพวกเขาควรมีหนึ่ง 1 และสอง 0s และ 1/8 ของพวกเขาควรจะไม่มี 1 และสาม 0
การทดสอบแบบสุ่ม # 3
"การทำงาน" ถูกกำหนดให้เป็นชุดลำดับของบิตที่ทุกคนมีค่าเดียวกัน สตริง1001001110
มีขนาดการรันสามขนาด 1 ( 1..1.....0
), ขนาดรันสองขนาด 2 ( .00.00....
) และขนาดรันหนึ่งขนาด 3 ( ......111.
) ขอให้สังเกตว่าการทำงานไม่ทับซ้อนกัน
จากสตริงของบิตสุ่ม 1,000 บิตควรมีขนาดประมาณ 250 การไหลของ 1, 125 การวิ่งของขนาด 2, 62 การวิ่งของขนาด 3, ฯลฯ โดยทั่วไปสำหรับขนาดรัน R ควรมี1000/(2**(R+1))
ขนาดของการวิ่งประมาณนั้น
การทดสอบแบบสุ่ม # 4
840 บิตแรกแบ่งออกเป็นสองส่วนเท่า ๆ กันละ 420 บิต แต่ละบิตในครึ่งแรกจะถูกเปรียบเทียบกับบิตที่เกี่ยวข้องในครึ่งหลัง สองบิตควรจับคู่ประมาณห้าสิบเปอร์เซ็นต์ของเวลา
นี่คือซอร์สโค้ดของโปรแกรม Perl ที่ดำเนินการทดสอบ 2 ถึง 4 ณ ตอนนี้มันต้องการให้สตริงของบิตไม่มีช่องว่างใด ๆ
เวลาเกณฑ์การชนะอย่างมีวัตถุประสงค์!
ผู้ชนะคือโปรแกรมที่ผ่านข้อกำหนดทั้งหมด 6 ข้อและการทดสอบแบบสุ่มทั้งหมดจนถึงระดับที่ไม่สามารถแยกแยะได้จากการสุ่ม หากโปรแกรมหลายรายการประสบความสำเร็จโปรแกรมที่ใช้เวลาในการทำซ้ำนานที่สุดจะเป็นผู้ชนะ หากหลาย ๆ โปรแกรมทำสิ่งนี้สำเร็จฉันอาจต้องหาการทดสอบแบบสุ่มเพิ่มเติมเพื่อทำหน้าที่เป็นตัวแบ่งไทเบรก