อะไรคือเมล็ดพันธุ์ที่เล็กที่สุดและง่ายที่สุดสำหรับเครื่องกำเนิดเลขสุ่ม?


40

ไมโครคอนโทรลเลอร์ขนาดเล็ก (Atmel 8 บิต) ควบคุมไฟจำนวนหนึ่งเพื่อนำเสนอการแสดงแสงที่มีลำดับแสงแบบสุ่มจำนวนมาก

หลอกที่เหมาะสม -RNG ทำงานได้ดี แต่ฉันกำลังมองหาเมล็ดพันธุ์ที่ดีสำหรับมัน เมล็ดจะมีความจำเป็นเพราะถ้ามีคนเปิดอุปกรณ์หลายอย่างพร้อมกันมันจะไม่ดูดีถ้าพวกเขาสร้างลำดับของเอฟเฟกต์เดียวกันจนกว่าพวกเขาจะค่อยๆแยกออกจากกันเนื่องจากความแตกต่างเล็ก ๆ ในแหล่งสัญญาณนาฬิกาของแต่ละคน

วิธีที่ดีมากในการหว่านหลอก -RNG ซึ่งฉันใช้บ่อยเป็นไปได้ในกรณีของอุปกรณ์ที่ต้องเริ่มต้นด้วยการกดปุ่มหรือพลิกของสวิตช์ ทันทีที่เปิดใช้งาน µc ตัวจับเวลาอย่างรวดเร็วสามารถเริ่มต้นได้และค่าของตัวจับเวลานี้จะรวมค่า RNG ทันทีที่กดปุ่มเป็นครั้งแรก

ปัญหาคือในสถานการณ์นี้ไม่มีปุ่ม โปรแกรมจะต้องเริ่มต้นทันทีที่เปิดอุปกรณ์

สถานที่บน PCB มีข้อ จำกัดอย่างมาก (ไม่มีอะไรมากไปกว่าชิ้นส่วน SMD ขนาดเล็กที่สุดบางชิ้นที่อาจพอดี) ดังนั้นฉันจึงกำลังมองหาทางออกที่เล็กที่สุดและง่ายที่สุดเท่าที่จะเป็นไปได้ ดังนั้นฉันจะออกกฎแฟนซีโซลูชั่นเช่นฮาร์ดแวร์ RNG จริง, เครื่องรับวิทยุ ฯลฯ

สิ่งที่ฉันมีคือตัวจับเวลาตัวนับ 16 บิตใน CPU และพอร์ตที่ไม่ได้ใช้ซึ่งเข้าถึง ADC

วิธีแก้ปัญหาปัจจุบันของฉันคือใช้ตัวต้านทาน (ไม่แม่นยำเท่าที่จะเป็นไปได้) เพื่อให้แรงดันไฟฟ้าครึ่งหนึ่งให้กับขา ADC และให้ค่า RNG ด้วยค่าการแปลง AD ครั้งแรก อย่างไรก็ตามปัจจุบันตัวต้านทาน 10% ส่วนใหญ่มีความไม่ถูกต้องต่ำกว่า 1% (มันคงจะสนุกที่จะจินตนาการถึงหน้าตาของซัพพลายเออร์เมื่อฉันบอกพวกเขาว่าเราต้องการตัวต้านทาน SMD คุณภาพต่ำที่สุดที่พวกเขาสามารถพบได้) ดังนั้นจึงมีโอกาสสูงมาก หลายหน่วยเริ่มต้นด้วยเมล็ดเดียวกัน

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

ไม่มีใครมีข้อเสนอแนะที่ดีกว่า? เมล็ดไม่จำเป็นต้องกระจายอย่างสมบูรณ์แบบสม่ำเสมอ แต่ยิ่งกระจายเท่ากันก็ยิ่งดีเท่านั้น เมล็ดพันธุ์ขนาด 16 บิตที่มีการกระจายที่สมบูรณ์แบบนั้นเป็นความฝันที่ดีเกินจริง แต่ฉันคิดว่าการกระจายที่เหมาะสมครึ่งทางมากกว่า 5 หรือ 6 บิตอาจเพียงพอ


12
"มันจะสนุกที่จะจินตนาการถึงใบหน้าของซัพพลายเออร์เมื่อฉันบอกพวกเขาว่าเราต้องการตัวต้านทาน SMD ที่มีคุณภาพแย่ที่สุดที่พวกเขาสามารถหาได้" - มันคงจะสนุกกว่าที่จะให้ค่าของตัวต้านทานนี้ไม่ได้กำหนดไว้ในแผนภาพวงจร คนในการผลิตว่าส่วนนี้จะต้องทำการบัดกรีด้วยตนเองหลังจากที่ pcb ออกมาจากเครื่องจัดวางจากถังขยะที่เราผสมกันทุกค่าตัวต้านทานที่เรามี - เพราะมันไม่ RNG ฉันกำลังมองหา แต่เมล็ด ดังนั้นหากมันสร้างมูลค่าเท่ากันเกือบทุกครั้งที่มันไม่ได้แย่ขนาดนั้นมันสำคัญกว่าที่จะแตกต่างกันไปตามอุปกรณ์
vsz

8
ทำไมไม่เขียนค่าสุ่มไปยังที่เก็บข้อมูล EEPROM ในระหว่างการเขียนโปรแกรมการผลิต? ด้วยวิธีนี้คุณสามารถใช้ RNG ที่ยอดเยี่ยมที่สุดที่คุณต้องการเพราะมันจะอยู่ในโปรแกรมเมอร์ผู้ผลิตเท่านั้นไม่ใช่อุปกรณ์ปลายทาง (เครดิต @immibis: 'ไฟล์ซอฟต์แวร์ที่แตกต่างออกไปเล็กน้อย' ของคุณให้ฉันคิด.)
Calrion

2
ดังนั้นเพื่อให้ชัดเจน 100% ปัญหาคือว่าพวกเขาอาจเริ่มต้นในลำดับเดียวกันไม่ใช่ว่าพวกเขาอาจแยกออกจากกันเมื่อเวลาผ่านไปถูกต้องหรือไม่
พุธ

2
การเลือกใช้ RNG ของคุณมีความสำคัญ: บางคนต้องการเมล็ดพันธุ์ที่มีคุณภาพดี ตัวอย่างเช่นสำหรับ Xorshift เมล็ดใด ๆ ที่ไม่ใช่ 0 จะทำงานได้และจะทำงานได้ดีเท่าเทียมกัน แม้ความแตกต่างเล็กน้อยในเมล็ดเริ่มต้นจะส่งผลให้ตำแหน่งเริ่มต้นแตกต่างกันมากในวงจรของ RNG
อยากรู้อยากเห็น dannii

3
คุณสามารถรวมคำตอบ ADC ทั้งหมดเข้ากับสถิติและกำหนดเวลาเพื่อให้มีความสุ่มมากขึ้น ตัวอย่างเช่นวัดจำนวนตัวประมวลผลที่ทำเครื่องหมายไว้จนกว่าคุณจะรับตัวอย่าง N โดยที่ LSB 3 ตัวต่ำกว่าคือ 101 และตัวอย่าง M ซึ่ง LSB 3 ตัวล่างเป็น 110 ขยายแนวคิดนี้ตามที่ต้องการ
wjl

คำตอบ:


24

ใส่ตัวต้านทานและตัวเก็บประจุแบบขนานระหว่างพิน A / D และกราวด์ ทำให้ตัวต้านทานค่อนข้างสูงโดยเฉพาะอย่างยิ่งเหนือข้อกำหนดอิมพิแดนซ์สัญญาณอินพุตสำหรับ A / D ทำให้ค่าเวลา RC คงที่ประมาณ 10 .s ตัวอย่างเช่น 100 kΩและ 100 pF ฟังดูเหมือนเป็นการผสมผสานที่ดี

ในการรับค่าที่มีการสุ่มลองขับหมุดให้สูงสักครู่แล้วตั้งค่าเป็นอิมพีแดนซ์สูงและใช้ A / D อ่านหลังจากนั้นไม่กี่วินาที โดยเฉพาะอย่างยิ่งหากคุณใช้เวลาในการเก็บ A / D อย่างไม่ถูกต้องแรงดันไฟฟ้าที่จะเห็นจะขึ้นอยู่กับค่า R และ C กระแสรั่วไหลของพินเสียงรบกวนรอบข้างและอุณหภูมิอื่น ๆ

หยิบบิตต่ำหรือสองบิตต่ำแล้วทำซ้ำตามความจำเป็นเพื่อรับบิตสุ่มจำนวนเท่าใดก็ได้

สำหรับรูปแบบการสุ่มที่มากขึ้นให้ทำตามโพรซีเดอร์นี้เป็นครั้งคราวและฉีดผลลัพธ์ A / D จำนวนเล็กน้อยลงในตัวสร้างตัวเลขสุ่มที่คุณใช้อยู่


ฟังดูดีนะ อย่าลืมตรวจสอบอิมพิแดนซ์อินพุตใน ADC - Atmega8 ซีรี่ย์นั้นมีอิมพิแดนซ์อินพุตแบบอนาล็อกที่ 100Meg ซึ่งทำให้ค่าความต้านทานของแลงมีค่าน้อย
stefandz

3
@stef: อิมพิแดนซ์อินพุตและอิมพิแดนซ์สัญญาณที่จำเป็นสำหรับการแปลงที่ถูกต้องเป็นสองสิ่งที่แตกต่างกัน ใช่ความต้านทานอินพุตมีค่าสูงมากเนื่องจากเป็น CMOS อย่างไรก็ตามมีการ จำกัด ความต้านทานสูงสุดของสัญญาณเพื่อให้สามารถชาร์จตัวอย่างและยึดหมวกไว้ได้ภายในเวลาที่กำหนดและเพื่อเอาชนะสิ่งที่รั่วไหลได้
Olin Lathrop

2
ขออภัยจากคำตอบของคุณฉันคิดว่าคุณกำลังอ้างอิงความต้านทานอินพุตตรงข้ามกับข้อมูลจำเพาะอิมพิแดนซ์ต้นทาง 10k เป็นค่าอิมพิแดนซ์สูงสุดของ Atmega8 ที่ระบุดังนั้นคำตอบของคุณคือ สำหรับการอ้างอิงหมวก S / H ภายในคือ 14pF ในกรณีที่ใครสนใจ
stefandz

2
@stef: ฉันแก้ไขคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
Olin Lathrop

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

23

ตัวเลือกที่เป็นไปได้:

  1. ตั้งโปรแกรมหมายเลขซีเรียลเฉพาะไว้ล่วงหน้าสำหรับแต่ละอุปกรณ์ หากคุณมีอัลกอริทึม RNG ที่ดีพอแม้แต่รายการลำดับของที่อยู่อนุกรมจะให้ผลลัพธ์ที่แตกต่างกัน

  2. ขึ้นอยู่กับ MCU / การตั้งค่าของคุณคุณอาจมีแหล่งสัญญาณนาฬิกาสองแบบที่แตกต่างกันสำหรับนาฬิการะบบและอินพุตตัวนับ หากหนึ่ง / ทั้งสองนี้มีความแปรปรวนอย่างมีนัยสำคัญคุณสามารถใช้สิ่งนี้เพื่อสร้างเมล็ดที่แตกต่างกันอย่างเหมาะสม นี่คือตัวอย่างที่ผมเขียนซึ่งใช้เวลาจ้องจับผิดของ Arduino ภายในและนาฬิการะบบ

  3. ใช้ทรานซิสเตอร์ BJT และสร้างแอมพลิฟายเออร์ที่ขึ้นกับเบต้าขั้นสูง สามารถอ่านได้จาก ADC สำหรับเมล็ด

  4. โดยทั่วไปแล้วตัวเก็บประจุ / ตัวเหนี่ยวนำจะถูกระบุให้มีค่าความคลาดเคลื่อนที่ต่ำกว่าตัวต้านทาน คุณสามารถสร้างวงจรฟิลเตอร์ (RC, RL, LC) ได้ด้วยสิ่งเหล่านี้และวัดเอาท์พุทด้วย ADC


5
ฉันลงคะแนนให้ตัวเลือกที่ 1 มันเป็นวิธีแก้ปัญหาการนับจำนวนศูนย์ที่จะส่งผลให้ลำดับไม่เคยตรงกัน หมายเลขซีเรียลและตัวสร้าง RND สามารถบอกได้ว่า 16 บิตทำให้อุปกรณ์ใด ๆ มีโอกาสน้อยมากในการเลียนแบบรูปแบบของผู้อื่น
KalleMP

1
ฉันชอบวิธีแก้ปัญหาอย่างหนึ่ง ถ้าคุณใช้อัลกอริทึมการแปลงแป้นพิมพ์อย่างง่ายคุณควรจะใช้ได้แม้ว่าคุณจะมีหมายเลขซีเรียลเรียงตามลำดับ
magu_

6
สิ่งที่ดีเกี่ยวกับตัวเลือกที่ 1 คือว่าอุปกรณ์บางอย่างมาด้วยในตัวหมายเลข serial (ปกติ / เครือข่ายที่เกี่ยวข้องกับ RF ไมโคร) เพื่อให้คุณไม่จำเป็นต้องมีขั้นตอนที่แยกต่างหากเพื่อเผาหมายเลข serial
slebetman

3
แม้ RNG ขยะเหมือนLCGจะ"ก่อให้เกิดผลที่แตกต่างกันอย่างดุเดือดสำหรับรายชื่อเรียงตามลำดับของที่อยู่อนุกรม" ฉันลงคะแนนให้ 1
BlueRaja - Danny Pflughoeft

3
หากคุณมีแหล่งเวลาแล้วการใช้สิ่งนั้นเป็นฐานสำหรับสวิตช์ของคุณในเมล็ดจะช่วยชดเชยสิ่งต่าง ๆ ระหว่างการทำงาน รวมสิ่งนี้กับที่อยู่ / หมายเลขซีเรียลหรือที่อยู่ MAC หากอุปกรณ์ของคุณมีและคุณจะแก้ไขการจับคู่ระหว่างอุปกรณ์ด้วย ฉันได้เห็นซอฟต์แวร์บางตัวที่เก็บหมายเลขสุ่มบางส่วนหรือทุกหมายเลขที่สร้างขึ้นเพื่อใช้เป็นเมล็ดพันธ์อย่างต่อเนื่องแม้หลังจากรีบูตเครื่อง หากอุปกรณ์ของคุณมีเวลาการทำงานที่แตกต่างกันพวกเขาควรแยกออก
TafT

8

หน่วยความจำเริ่มต้น

คุณสามารถลองใช้หน่วยความจำที่ไม่ได้กำหนดค่าเริ่มต้นในคอนโทรลเลอร์ไมโคร เคล็ดลับคือการหาบิตที่มี flip-flop ที่ 'สมดุล' มากที่สุดและเป็นแบบสุ่ม ขั้นตอนคือการอ่านหน่วยความจำทั้งหมดรีเซ็ตและทำซ้ำสองสามครั้งเพื่อวัดบิตที่สุ่มอย่างแท้จริง จากนั้นคุณใช้แผนที่นี้เพื่ออ่านบิตสุ่มที่เพียงพอในการหว่าน PRNG หรือ LFSR ของคุณ!

วิธีการนี้จะช่วยให้คุณเมล็ดสุ่มแม้จะมีฮาร์ดแวร์ที่เหมือนกันมีรายละเอียดมากขึ้น (และการเชื่อมโยง) ที่มีอยู่ในนี้สับวันบทความ

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


1
คุณไม่จำเป็นต้องรู้ว่าบิตใดที่สุ่ม XOR-ing all bytes จะให้ผลลัพธ์แบบสุ่มแม้ว่าคุณจะสุ่มเพียง 8 บิตก็ตาม และตามที่แสดงในภาพค่าที่แท้จริงอาจไม่สุ่มในความรู้สึกทางโลกพวกมันมีเอกลักษณ์ไม่เหมือนใคร - ซึ่งเป็นสิ่งที่เราต้องการตรงนี้
MSalters

1
หากคุณสามารถหา PRNG ที่อนุญาตให้คุณ "ผสมใน" เอนโทรปีก็อาจดีกว่าตัวเลือก XOR-then-seed วนซ้ำผ่านหน่วยความจำที่ไม่ได้กำหนดค่าเริ่มต้นและผสมเป็นไบต์ไปยัง PRNG เช่นเห็นของฉันsimplerandom C ฟังก์ชั่นห้องสมุดผสม
Craig McQueen

สิ่งนี้จะไม่ให้คุณภาพการเข้ารหัสแบบสุ่มแก่คุณ

@CamilStaps แน่นอนว่ามันจะไม่
Navin

1
สิ่งนี้จะไม่ทำงาน หน่วยความจำที่ไม่ได้กำหนดไว้เป็นพฤติกรรมที่ไม่ได้กำหนดถ้าฉันมีระบบปฏิบัติการและฉันไม่สามารถควบคุมได้ว่าหน่วยความจำส่วนใดที่จะถูกกำหนดให้กับโปรแกรมของฉันและสิ่งที่เคยมีมาก่อน บนไมโครคอนโทรลเลอร์ที่ไม่มีระบบปฏิบัติการนี่ไม่ใช่กรณี โดยเฉพาะอย่างยิ่งกับ AVR เนื่องจากมี RAM ทั้งหมดจะเป็นศูนย์หากเวลาผ่านไปนานพอที่ตัวเก็บประจุจะถูกทำให้ว่างเปล่าโดยการสิ้นเปลืองกระแสไฟในขณะที่ไม่มีไฟ
vsz

7

สิ่งที่ฉันทำสำหรับเครื่องเล่น MP3 ที่มีความสามารถแบบสุ่มคือเพียงแค่ใช้ซีเควนซ์แบบลำดับที่ต่างกันในทุก ๆ การเปิดเครื่อง ฉันเริ่มต้นที่ 1 และเก็บสิ่งนี้ไว้ใน EEPROM เพื่อที่รอบพลังงานถัดไปฉันใช้ 2 ฯลฯ นี่คือบน ATMEGA168 ในฐานะที่เป็น helloworld922 ตั้งข้อสังเกตแม้แต่เมล็ดลำดับง่าย ๆ จะสร้างลำดับสุ่มหลอกแตกต่างกันอย่างสมบูรณ์

ฉันใช้เครื่องกำเนิดแบบลำดับเชิงเส้นตรงสมภาคหนึ่งนี่เป็นการกระจายแบบสม่ำเสมอ

int i;
seed = seed * 2053 + 13849;
i = (seed % max) + 1;  // max is the maximum value I want out of the function

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

สิ่งนี้สามารถทำได้โดยวิธีใด ๆ ที่เสนอโดยผู้โพสต์คนอื่น ๆ - วิธีหนึ่งที่ฉันคิดว่าสามารถใช้ AC zero cross ในการประมวลผลได้ถ้าคุณมี (สำหรับการควบคุมเฟสของหลอดไฟ)? สิ่งนี้สามารถใช้เพื่อสุ่มตัวอย่างตัวจับเวลาในการข้ามครั้งแรกหลังจากเปิดเครื่องแล้วใช้เป็นเมล็ด

มีปุ่มกดใด ๆ บนตัวเครื่องเพื่อเลือกโหมด ฯลฯ หรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถสุ่มตัวอย่างตัวนับในครั้งแรกที่ปุ่มถูกกดหลังจากโปรแกรมถูกตั้งโปรแกรมให้คุณสามารถสร้างเมล็ดพันธุ์แบบสุ่มในขั้นต้นและเก็บไว้ใน EEPROM ทุกพลังหลังจากจุดนี้จะใช้เมล็ดพันธุ์ที่เก็บไว้


5

ADC เป็นแหล่งข้อมูลที่ดีมากสำหรับการสุ่ม

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

คุณไม่ควรปล่อยให้พิน ADC ลอย; สิ่งนี้อาจทำให้แรงดันไฟฟ้าลอยไปไกลเกินไปและอาจทำให้อินพุตเสียหาย
(MCU หลายตัวอนุญาตให้คุณใช้แรงดันไฟฟ้าครึ่งหนึ่งเป็นอินพุต ADC สำหรับการสอบเทียบซึ่งจะช่วยลดตัวต้านทานภายนอกและยังคงส่งเสียงรบกวนอีกครั้งดูแผ่นข้อมูลสำหรับการกำหนดค่าที่แย่ที่สุด / ดีที่สุด)

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


2
ฉันไม่แน่ใจว่าเสียงของจอห์นสันเหมาะสมในแอปพลิเคชันนี้หรือไม่ ที่ STP ตัวต้านทาน 10Meg ที่แบนด์วิดท์ 10kHz มี40uVสัญญาณรบกวน Johnson คุณจะต้องมี ADC> 14 บิตหรือวงจรขยายเพื่อวัดสิ่งนี้อย่างสมเหตุสมผล
helloworld922

STP ไม่เกี่ยวข้องจริงๆ อุณหภูมิอาจเพิ่มสูงขึ้นโดยเฉพาะอย่างยิ่ง แต่การเพิ่ม STP มากกว่า 60 องศาเป็นเพียงเสียงรบกวนเพิ่มขึ้น 10%
MSalters

1
วิธีการที่คล้ายกันคือการใช้สัญญาณรบกวนการยิงในไดโอด en.wikipedia.org/wiki/Noise_generator#Shot_noise_generators
teambob

2

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

ความคิดอื่น: คุณจะเชื่อมโยงหลาย ๆ หน่วยเข้าด้วยกันอย่างไรเพื่อให้พวกเขาเปิดพร้อมกัน? หากอยู่ในอนุกรมให้เพิ่มตัวเก็บประจุบางชนิดเพื่อให้อุปกรณ์ (n + 1) th เริ่มรอบนาฬิกาสองสามรอบหลังจากอุปกรณ์ที่ n ตามหลักการแล้วตัวเก็บประจุจะคายประจุออกอย่างรวดเร็วเมื่อปิดอุปกรณ์ดังนั้นทุกครั้งที่มีการเริ่มต้น / รีสตาร์ทจะมีช่องว่างขนาดใหญ่ขึ้นระหว่างลำดับ

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

รูปแบบของสิ่งนี้คือการเพิ่มความแปรปรวนให้กับสัญญาณนาฬิกาของคุณถ้าเป็นไปได้ ความแตกต่างของความเร็วนาฬิกา 0.1% อาจมีผลกระทบเล็กน้อยต่อการแสดงแสงในขณะที่การเปลี่ยนแปลงอัตราที่คุณสำรวจตาราง PRNG ค่อนข้างเร็ว


1
อาจเชื่อมต่อเทขนาดใหญ่เข้ากับอะนาล็อกในพินและอ่านค่า "mains hum" เพื่อหว่าน RNG
Jasen

1
@ Jasen ทุกหน่วยที่เชื่อมต่อกับสายต่อขยายเดียวกันจะเห็นเสียงฮัมเดียวกัน
Ian Ringrose

2

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

นอกจากนี้ยังใช้การก้าวกระโดดทุกครั้งและจากนั้น (ไม่บ่อย) และส่งใหม่ในขณะที่อุปกรณ์เปิดอยู่ (บันทึกค่าใหม่นี้ใน EEPROM)


2

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


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

1

2 วิธีแก้ปัญหาที่เป็นไปได้ทั้งคู่สมมติว่าคุณต้องการเมล็ดพันธุ์ที่ไม่ซ้ำกันต่อหน่วย

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

  2. อุปกรณ์สายไฟดัลลัส 1 ใช้เพียงหนึ่งพินและแต่ละตัวมาพร้อมกับหมายเลขซีเรียล 64 บิตที่ไม่ซ้ำกัน คุณสามารถใช้สิ่งนี้เป็นเมล็ดพันธุ์


1
ฉันชอบ 2 แต่น่าเสียดายที่ชิ้นส่วน DS ทั้งหมดค่อนข้างแพง
Ariser

อย่าใช้การประทับเวลาการผลิตสำหรับการสุ่มคุณภาพของ crypto ซึ่งสามารถคาดเดาได้

2
@CamilStaps สำหรับแอปพลิเคชันของ OP ไม่จำเป็นต้องใช้คุณภาพการเข้ารหัสลับ
Hagen von Eitzen

1
@ HagenvonEitzen จริง แต่คนอื่นอาจมาที่คำถามนี้ค้นหาแบบสุ่ม crypto-Q ดังนั้นจึงเป็นมูลค่าการกล่าวขวัญ

4
@CamilStaps ถอนหายใจดูเหมือนว่าคุณยอมแพ้ต่อมนุษยชาติ :) เป็นความต้องการที่คาดหวังจากใครบางคนที่ต้องการใช้คำตอบจากอุปกรณ์อิเล็กทรอนิกส์สำหรับการเข้ารหัสลับที่พวกเขาต้องระวังอย่างเพียงพอที่จะอ่านคำถามที่ควรจะตอบ ? "16 บิต" หรือ "5 o5 6 บิต" เมล็ดไม่ใช่ crypto-Q แม้ว่าจะถูกสร้างขึ้นโดยกลุ่มแมวSchrödinger :)
Hagen von Eitzen

1

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

อย่าลืมใช้เวลาแปลงขั้นต่ำที่เป็นไปได้

โซลูชันอื่นอาจเป็นเครื่องกำเนิดเสียงที่ใช้กับขา ADC


2
ฉันจะทำให้วัดบาง แต่ถ้าผมจำไม่ผิดขา ADC ลอยอ่านหรือใกล้เคียงกับ0 0ฉันจะตรวจสอบอีกครั้งเพื่อดูว่าเป็นอย่างนั้นหรือไม่
vsz

1
ฉันสนใจมันอ่าน0เมื่อลอย
Bence Kaulics

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