เครื่องกำเนิดตัวเลขสุ่มโดยใช้พิน GPIO?


22

ฉันเพิ่งอ่านคำถามโดยใช้เครื่องกำเนิดหมายเลขสุ่มของ AVRและพบวิธีสร้างเมล็ดสุ่มใน AVR:

  • ใช้ "Secure AVR" เพื่อวัตถุประสงค์พิเศษ
  • ใช้เซ็นเซอร์อุณหภูมิภายใน
  • อ่าน EEPROM ที่ไม่ได้เขียน
  • วัดช่วงเวลาระหว่างอินพุตของผู้ใช้
  • ใช้ขา ADC แบบลอย

เหตุใดจึงไม่ใช่เพียงพินดิจิตอลเดียวที่ตั้งค่าเป็นอินพุทโดยไม่ต้องดึงขึ้นและลอย ในทางทฤษฎีที่ควรสร้างกระแสบิตสุ่ม ทำไมไม่ใช้สิ่งนี้? รัฐเปลี่ยนแปลงช้าเกินไปหรือไม่? มันมักจะติดที่ 1 หรือ 0 หรือไม่? มีปัญหาอื่นอีกไหม?


1
Secure AVR นั้นตายแล้ว AFAIK
vicatcu

1
eeprom ไม่ได้เขียนไว้เสมอ 0xFF หรือไม่
vsz

@ vsz บางทีถ้าคุณเขียนอะไรลงไปแล้วลืมสิ่งที่คุณเขียนไปมันเป็น "สุ่ม" ตอนนี้ ฮ่า ๆ.
Vorac

คำตอบ:


5

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

แม้ว่าค่าที่อ่านจากหมุดลอยนั้นไม่สามารถคาดเดาได้ ("สุ่ม" ในแง่แรก) แต่ก็ไม่น่าจะมีประโยชน์ในแง่ที่สอง


15

ความแตกต่างที่ชัดเจนในตัวเองระหว่างการใช้อินพุตดิจิตอลและอะนาล็อกคือความแตกต่างของค่าเมล็ดที่เป็นไปได้ในอนาล็อก

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

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


14

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


ไม่เพียง แต่จะติดค้างที่ 0 หรือ 1 ในบางเวลา แต่ถ้าทรานซิสเตอร์สองตัวที่ทำขึ้นในขั้นตอนแรกของอินพุตบัฟเฟอร์มีความสมดุลสมบูรณ์แบบหรือมีแหล่งจ่ายกระแสภายนอกภายนอกทางหรือทางอื่นอินพุตจะลอย มากถึง 1 หรือลงไปที่ 0 ในที่สุด
wjl

9

ทางออกที่ง่ายที่สุดคือการสร้างวงจรกำเนิดสัญญาณฮาร์ดแวร์แบบสุ่มออกมาจากวงจรทรานซิสเตอร์แบบเปิดที่ใช้ผิดประเภท ใช้เอาต์พุตบิตสตรีมไปยังอินพุตบนไมโครคอนโทรลเลอร์ ตัวอย่างบิตที่เข้ามาเป็นระยะ เพื่อให้แน่ใจว่าจำนวน 1s และ 0 จะเป็นคร่าวๆเพียงใช้การเปลี่ยนแปลงสถานะเป็น 1 และไม่มีการเปลี่ยนแปลงเป็นศูนย์ Google สำหรับเครื่องกำเนิดสัญญาณรบกวนทรานซิสเตอร์สำหรับข้อมูลเพิ่มเติม


น่าสนใจ "วงจรทรานซิสเตอร์แบบเปิดที่เก็บไม่ถูกต้อง" มีลักษณะอย่างไร
สตีเฟ่น Collings

7
@Remiel - คุณมีอคติกับชุมทางเบส - อิมิตเตอร์ของทรานซิสเตอร์และมันทำหน้าที่เหมือนซีเนอร์ที่เลวร้ายจริงๆ คุณใช้ซีเนอร์ที่มีเสียงดังมากและขยายเสียงเพื่อรับบิตสตรีมแบบสุ่ม ดูrobseward.com/misc/RNG2
Connor Wolf

3

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

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

Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister

ไม่มีถ้าสิ่งนี้ปลอดภัยแบบเข้ารหัส แต่ก็ดีพอสำหรับจุดประสงค์ส่วนใหญ่


นั่นคือวิธีการที่ใช้ในแอป msp430 ในคำถามก่อนหน้านี้ที่อ้างอิงถึงความรู้ของฉันระบบนาฬิกา AVR ไม่สนับสนุนเทคนิคนี้
vicatcu

แก้ไข. มันควรจะเป็นไปได้ที่จะทำกับแหล่งสัญญาณนาฬิกาเดิมแม้ว่าจะไม่ได้รับการสนับสนุนโดยตรง
Gustavo Litovsky

3

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

ตัวอย่างที่ดีของเอนโทรปีสูงใช้วิธีLatin Squaresสำหรับการสุ่มเมล็ด

อินพุตลอยสามารถเอนเอียงได้อย่างง่ายดายจากข้อบกพร่องการรั่วไหลหรือเสียงรบกวนทางเข้า


0

ในไมโครโปรเซสเซอร์ PIC18F คุณจะต้องมีเมล็ดสำหรับหมายเลขสุ่ม เมล็ดสามารถเป็นอะไรก็ได้ตั้งแต่ 0 ถึง 32767 (15 บิต) ฉันจะแนะนำในตอนเริ่มต้นโปรแกรมที่คุณทำหนึ่งในหมุดและหมุดอินพุตแบบอะนาล็อก อ่านพินนี้แล้วหาค่าบิตที่มีนัยสำคัญน้อยที่สุดแล้วใส่ลงในตัวแปร 16 บิต จากนั้นเลื่อนตัวแปรไปทางซ้าย 1 อ่านพินอีกครั้งแล้ววาง LSB ของผลลัพธ์ ADC ลงในบิตแรกของตัวแปรที่คุณเก็บบิตสุดท้ายไว้เลื่อนไปทางซ้ายอีกครั้ง .....

ทำซ้ำจนกว่าคุณจะมี 15 บิตในตัวแปรของคุณ นี่คือจำนวนที่คุณต้องใส่ในเมล็ดของคุณ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.