สำหรับโครงการของฉันฉันใช้แผนที่ Henon เพื่อสร้าง (หลอก) - จำนวนสุ่ม ฉันใช้รหัสต่อไปนี้เพื่อสร้างเมทริกซ์ของ (หลอก) - ตัวเลขสุ่ม
def create_by_henonmap (มิติ, คีย์):
x = คีย์[0]
y = คีย์[1]
# จำนวนรวมของ bitSequence ที่ผลิต
ลำดับขนาด = มิติ * มิติ * 8
bitSequence = [] # แต่ละ bitSequence ประกอบด้วย 8 บิต
byteArray = [] # แต่ละ byteArray มี m bitSequence
Matrix = [] # แต่ละ Matrix มี m*n byteArray
สำหรับฉันในช่วง (sequenceSize):
# แผนที่คลาสสิก Henon มีค่า a = 1.4 และ b = 0.3
xN = y + 1 - 1.4 * x**2
yN = 0.3 * x
x = xN
y = วาย
ถ้า xN <= 0.4:
บิต = 0
อื่น:
บิต = 1
พยายาม:
bitSequence.append(บิต)
ยกเว้น:
bitSequence = [บิต]
ถ้าฉัน % 8 == 7:
ทศนิยม = ธ.ค. (bitSequence)
พยายาม:
byteArray.append (ทศนิยม)
ยกเว้น:
byteArray = [ทศนิยม]
บิตลำดับ = []
byteArraySize = มิติ * 8
ถ้าฉัน % byteArraySize == byteArraySize-1:
พยายาม:
Matrix.append(byteArray)
ยกเว้น:
เมทริกซ์ = [byteArray]
ไบต์อาร์เรย์ = []
กลับเมทริกซ์
ก่อนที่ฉันจะใช้โค้ดนี้ในการผลิต ฉันจะทดสอบการสุ่มโดยชุดทดสอบ NIST จาก นี้ แต่ได้ผลลัพธ์นี้:
การทดสอบที่มีสิทธิ์จาก NIST-SP800-22r1a:
-โมโนบิต
-frequency_within_block
วิ่ง
-longest_run_ones_in_a_block
-dft
-non_overlapping_template_matching
- อนุกรม
-around_entropy
- ผลรวมสะสม
-random_excursion
-random_excursion_variant
ผลการทดสอบ:
- ผ่าน - คะแนน: 0.525 - Monobit - เวลาที่ผ่านไป: 0 ms
- ผ่าน - คะแนน: 0.999 - ความถี่ภายในบล็อก - เวลาที่ผ่านไป: 0 ms
- ล้มเหลว - คะแนน: 0.0 - เรียกใช้ - เวลาที่ผ่านไป: 1 ms
- FAILED - คะแนน: 0.002 - คนที่วิ่งนานที่สุดในบล็อก - เวลาที่ผ่านไป: 0 ms
- ล้มเหลว - คะแนน: 0.004 - การแปลงฟูเรียร์แบบไม่ต่อเนื่อง - เวลาที่ผ่านไป: 2 ms
- ผ่าน - คะแนน: 0.899 - การจับคู่เทมเพลตที่ไม่ทับซ้อนกัน - เวลาที่ผ่านไป: 8 ms
- ล้มเหลว - คะแนน: 0.0 - อนุกรม - เวลาที่ผ่านไป: 54 ms
- ล้มเหลว - คะแนน: 0.0 - เอนโทรปีโดยประมาณ - เวลาที่ผ่านไป: 102 ms
- ผ่าน - คะแนน: 0.887 - ผลรวมสะสม - เวลาที่ผ่านไป: 4 ms
- ล้มเหลว - คะแนน: 0.11 - การสุ่มตัวอย่าง - เวลาที่ผ่านไป: 28 ms
- ผ่าน - คะแนน: 0.678 - Random Excursion Variant - เวลาที่ผ่านไป: 1 ms
ฉันคิดว่าแผนที่ Chaotic สามารถสร้างการสุ่มได้เพียงพอ แต่ผลลัพธ์ที่ได้นั้นน่าผิดหวังมาก มีข้อผิดพลาดเชิงตรรกะภายในโค้ดที่สร้างผลลัพธ์ที่ไม่ดีนี้หรือไม่ ฉันเดาว่าวิธีที่มันสร้างลำดับบิตของตัวเลขทำให้เกิดปัญหา
ถ้า xN <= 0.4:
บิต = 0
อื่น:
บิต = 1
มีการใช้งานแผนที่อลหม่านเพื่อสร้าง (หลอก) - จำนวนสุ่มที่ดีกว่านี้หรือไม่?