Χρήση του Arduino Random Number Generator: Οι συναρτήσεις Random και RandomSeed. Μαθήματα Arduino - Χρονισμός και Τυχαία Δημιουργία ακολουθίας τυχαίων bit Arduino

Κατά τον προγραμματισμό του Arduino, υπάρχουν φορές που χρειάζεται να λάβετε έναν αριθμό που δεν θα είναι γνωστός εκ των προτέρων ούτε από τον προγραμματιστή που γράφει το σκίτσο ούτε από τον χρήστη που θα χρησιμοποιήσει το Arduino με ένα τέτοιο πρόγραμμα. Σε αυτήν την περίπτωση, μια γεννήτρια τυχαίων (ή μάλλον ψευδοτυχαίων) αριθμών έρχεται στη διάσωση.



Για να ενεργοποιήσετε αυτήν τη γεννήτρια, αρκεί να χρησιμοποιήσετε τις συναρτήσεις random() ή randomSeed(). Αυτό το άρθρο θα δείξει πώς να εργάζεστε με αυτές τις συναρτήσεις, καθώς και πώς να απαλλαγείτε από την ψευδοτυχαιότητα κατά τη δημιουργία αριθμών.


Γενικά, μια γεννήτρια ψευδοτυχαίων αριθμών μιμείται την τυχαιότητα ή την τυχαιότητα της εμφάνισης των αριθμών, αλλά στην πραγματικότητα, εάν αναλύσετε έναν αριθμό από αυτούς τους αριθμούς για αρκετά μεγάλο χρονικό διάστημα, μπορείτε να παρατηρήσετε ένα συγκεκριμένο μοτίβο.


Έτσι, η τυχαία συνάρτηση για τη δημιουργία ψευδοτυχαίων αριθμών μπορεί να έχει έως δύο παραμέτρους και να γραφεί ως τυχαία(max) ή τυχαία(min, max). Εδώ μέγιστη παράμετρος, που απαιτείται, ορίζει το άνω όριο του εύρους δημιουργίας ψευδοτυχαίων αριθμών. Με τη χρήση πρόσθετη παράμετροςΤο min μπορεί να χρησιμοποιηθεί για να ορίσετε το κάτω όριο του εύρους. Ως αποτέλεσμα, η συνάρτηση θα επιστρέψει κάποιο ψευδοτυχαίο αριθμό μεταξύ min και max-1.


Είναι σημαντικό να κατανοήσουμε ότι όταν χρησιμοποιείτε τη συνάρτηση random(), θα δημιουργείται ακριβώς η ίδια λίστα ψευδοτυχαίων αριθμών κάθε φορά. Για παράδειγμα, εάν φτιάξετε έναν κουλοχέρη και την πρώτη φορά που πατήσετε τη λαβή, θα εμφανιστεί ένας νικηφόρος συνδυασμός, τότε μπορείτε να είστε σίγουροι ότι εάν επαναφέρετε το Arduino και πατήσετε ξανά τη λαβή, αυτός ο κουλοχέρης θα δείξει την ίδια νίκη συνδυασμός. Πράγματι, στο Arduino δεν είναι εύκολο να υλοποιήσετε μια παιχνιδομηχανή με εντελώς τυχαία παραγωγή αριθμών, όπως, για παράδειγμα, υλοποιείται σε μηχανές τυχερών παιχνιδιών www.igrovye-apparati-vulcan.com/ , αλλά μπορείτε να λύσετε εν μέρει το πρόβλημα χρησιμοποιώντας το randomSeed () λειτουργία.


Αυτή η συνάρτηση παίρνει μια τιμή (για παράδειγμα, έναν ακέραιο) και χρησιμοποιεί έναν αριθμό για να τροποποιήσει τη τυχαία λίστα που δημιουργείται από τη συνάρτηση random(). βρόχος. Αλλά σε αυτήν την περίπτωση, θα υπάρχει μια σύλληψη, η οποία είναι ότι παρόλο που η ακολουθία των τυχαίων αριθμών θα είναι διαφορετική όταν χρησιμοποιείται η συνάρτηση randomSeed(), θα εξακολουθεί να είναι η ίδια κάθε φορά που εκτελείται το σκίτσο.


Η μόνη λύση σε αυτή την περίπτωση μπορεί να είναι μια επιλογή που χρησιμοποιεί αναλογικά περιφερειακά (ADC) και την αντίστοιχη λειτουργία analogRead (). Εάν δεν συνδέσετε την αναλογική είσοδο σε τίποτα, δηλαδή την αφήσετε «κρεμασμένη» στον αέρα, τότε χάρη στον θόρυβο σε αυτή τη γραμμή, μπορείτε να πάρετε πραγματικά τυχαίους αριθμούς. Στη συνέχεια, στη ρύθμιση εγκατάστασης, μπορείτε να γράψετε έτσι randomSeed(analogRead(A0)). Με την προϋπόθεση ότι η αναλογική θύρα A0 δεν είναι συνδεδεμένη πουθενά.

Πολλά έχουν γραφτεί για τις γεννήτριες τυχαίων αριθμών, αλλά σχεδόν πάντα, όσον αφορά την υλοποίηση, υπονοείται (ή δηλώνεται ρητά) ότι μιλαμεπερίπου x86/x64 και άλλες «ενήλικες» αρχιτεκτονικές. Ταυτόχρονα, τα φόρουμ που είναι αφιερωμένα στην ανάπτυξη συσκευών σε μικροελεγκτές είναι γεμάτα από ερωτήσεις «πώς μπορώ να δημιουργήσω έναν τυχαίο αριθμό στο %controllername%;». Επιπλέον, το εύρος των απαντήσεων εκτείνεται από «δείτε Google / Wikipedia» έως «χρήση της τυπικής λειτουργίας». Αυτή η "τυπική συνάρτηση" δεν είναι πάντα παρούσα και ταιριάζει στον προγραμματιστή από όλες τις απόψεις, τις περισσότερες φορές συμβαίνει το αντίθετο: είτε οι αριθμοί δεν είναι τυχαίοι, είτε η ταχύτητα εργασίας είναι πολύ χαμηλή ή ο κώδικας που προκύπτει δεν είναι χωράει καθόλου στην ελεύθερη μνήμη.
Ας προσπαθήσουμε να καταλάβουμε ποιοι είναι οι αλγόριθμοι για τη δημιουργία τυχαίων αριθμών, πώς να επιλέξετε τον σωστό και το πιο σημαντικό, ποια είναι τα χαρακτηριστικά της εφαρμογής αυτών των αλγορίθμων σε ελεγκτές.

Βαθμολογία τυχαίας

Οι εφαρμογές για RNG μπορεί να είναι πολύ διαφορετικές, από παιχνίδια μέχρι σοβαρή κρυπτογραφία. Κατά συνέπεια, οι απαιτήσεις για τη γεννήτρια ποικίλλουν επίσης πολύ. Για την αξιολόγηση της ποιότητας (επίπεδο "τυχαίας") της γεννήτριας, υπάρχουν ειδικές δοκιμές. Εδώ είναι τα πιο βασικά:
  • δοκιμή συχνότητας. Αποτελείται από την καταμέτρηση του αριθμού των μηδενικών και των μονάδων σε μια ακολουθία bit. Τα ένα και τα μηδενικά πρέπει να είναι περίπου ίσα.
  • Δοκιμή για μια ακολουθία πανομοιότυπων bits. Αναζητούνται σειρές πανομοιότυπων bit, όπως 000...0 ή 111...1. Η κατανομή των συχνοτήτων που συναντά η σειρά, ανάλογα με το μήκος τους, θα πρέπει να αντιστοιχεί σε μια τέτοια κατανομή για ένα πραγματικά τυχαίο σήμα.
  • Φασματική δοκιμή. Ο διακριτός μετασχηματισμός Fourier εφαρμόζεται στην αρχική ακολουθία. Το προκύπτον φάσμα δεν πρέπει να έχει σημαντικές κορυφές που θα υποδεικνύουν την παρουσία περιοδικών ιδιοτήτων της αλληλουχίας.
  • Τεστ αυτοσυσχέτισης. Υπολογίζεται η τιμή συσχέτισης μεταξύ των αντιγράφων της ακολουθίας που έχουν μετατοπιστεί μεταξύ τους. Το τεστ σάς επιτρέπει να βρείτε επαναλαμβανόμενες ενότητες με μια σειρά.
Υπάρχουν ειδικά κιτ που περιλαμβάνουν δεκάδες παρόμοιες δοκιμές:
NIST - χρησιμοποιείται στον διαγωνισμό AES για την αξιολόγηση αλγορίθμων κρυπτογράφησης.
Το DIEHARD είναι ένα από τα πιο αυστηρά σετ που υπάρχουν.

Αλγόριθμοι PRNG

Οποιαδήποτε ακολουθία που δημιουργείται σύμφωνα με έναν σκληρά κωδικοποιημένο αλγόριθμο δεν μπορεί να θεωρηθεί πραγματικά τυχαία, επομένως, όταν μιλάμε για αλγοριθμικές γεννήτριες, χρησιμοποιούν τον όρο ψευδοτυχαίαακολουθία. Οποιαδήποτε γεννήτρια ψευδοτυχαίων αριθμών (PRNG) κάνει βρόχους αργά ή γρήγορα, ένα άλλο πράγμα είναι ότι αυτό το "όψιμο" μπορεί να έρθει σε λίγα χιλιοστά του δευτερολέπτου ή ίσως σε λίγα χρόνια. Η διάρκεια του κύκλου εξαρτάται από το μέγεθος της εσωτερικής κατάστασης της γεννήτριας N (στην πραγματικότητα, αυτή είναι η ποσότητα μνήμης που χρειάζεται η γεννήτρια) και κυμαίνεται από 2 (N / 2) έως 2 N bits.
Έχει εφευρεθεί ένας τεράστιος αριθμός αλγορίθμων PRNG, αλλά δεν είναι όλοι βολικοί για εφαρμογή σε μικροελεγκτές. Είμαστε πολύ περιορισμένοι σε ταχύτητα και διαθέσιμη μνήμη, πολλοί ελεγκτές δεν υποστηρίζουν πραγματικές αριθμητικές εντολές ακόμη και πολλαπλασιασμού. Έχοντας υπόψη αυτούς τους περιορισμούς, ας δούμε μερικούς γνωστούς αλγόριθμους.
Γραμμική σύμφωνη μέθοδος
Το επόμενο μέλος της ακολουθίας υπολογίζεται από τον τύπο
X i+1 = (aX i + c) mod m
Αριθμός Μκαθορίζει τη μέγιστη περίοδο της ακολουθίας, ακέραιοι έναΚαι ντο- «μαγικοί» συντελεστές. Αριθμός Μείναι λογικό να επιλέξετε ίση με την ισχύ των δύο, οπότε η λειτουργία μείωσης του modulo μειώνεται στην απόρριψη των high bits. Για να επιτευχθεί η μέγιστη περίοδος, πρέπει να πληρούνται οι ακόλουθες προϋποθέσεις:
- ντοκαι το m πρέπει να είναι coprime,
- Α'1πρέπει να είναι πολλαπλάσιο Πγια όλους τους πρώτους διαιρέτες Παριθμοί Μ,
- Αν Μείναι πολλαπλάσιο του 4 (και στην περίπτωσή μας θα είναι πολλαπλάσιο), τότε Α'1πρέπει να είναι πολλαπλάσιο του 4.
Υπάρχει μια ακόμη λεπτότητα: μόνο τα υψηλά bit της μεταβλητής κατάστασης X πρέπει να λαμβάνονται ως αποτέλεσμα, καθώς οι στατιστικές παράμετροι της τυχαιότητας είναι πολύ χειρότερες για τα χαμηλά bit. Ο γραμμικός συγχρονικός αλγόριθμος εφαρμόζεται συνήθως ως τυπική rand() σε πολλές βιβλιοθήκες.

Πλεονεκτήματα:

  • τη μέγιστη δυνατή περίοδο για ένα δεδομένο μέγεθος μεταβλητής κατάστασης·
  • αρκετά γρήγορα;
  • συχνά ήδη υλοποιείται στη βιβλιοθήκη του μεταγλωττιστή.
Μειονεκτήματα:
  • Απαιτείται λειτουργία πολλαπλασιασμού.
  • δεν είναι όλα τα bit εξίσου τυχαία.
Περίληψη:γρήγορος και απλός αλγόριθμος για μη πολύ υπεύθυνες εφαρμογές.
Μέθοδος Fibonacci με καθυστερήσεις
Αυτός ο αλγόριθμος χρησιμοποιεί τη σχέση
X i \u003d X i-a - X i-b,
πού είναι η μεταβλητή κατάσταση Χείναι ένας ανυπόγραφος ακέραιος αριθμός. Τιμές καθυστέρησης έναΚαι σιΔεν λαμβάνονται οποιεσδήποτε, αλλά αυστηρά καθορισμένες· συνιστώνται ζεύγη (17,5), (55,24) ή (97,33) για την επίτευξη της μέγιστης ποιότητας. Όσο μεγαλύτερη είναι η καθυστέρηση, τόσο μεγαλύτερη είναι η περίοδος και τόσο καλύτερες είναι οι φασματικές ιδιότητες της ακολουθίας. Από την άλλη πλευρά, για να λειτουργήσει η γεννήτρια, απαιτείται η αποθήκευση max(a,b) των προηγούμενων αριθμών, κάτι που δεν είναι πάντα αποδεκτό. Επίσης, για να τρέξετε τη γεννήτρια, χρειάζεστε max(a,b) αριθμούς, οι οποίοι συνήθως λαμβάνονται χρησιμοποιώντας ένα απλούστερο PRNG.

Πλεονεκτήματα:

  • δεν απαιτεί λειτουργίες πολλαπλασιασμού.
  • όλα τα bit ενός τυχαίου αριθμού είναι στατιστικά ισοδύναμα.
Μειονεκτήματα:
  • απαιτεί μεγάλη ποσότητα μνήμης.
  • απαιτεί μια μεγάλη σειρά αριθμών για να εκτελεστεί.
Περίληψη:αλγόριθμος πολύ υψηλής ποιότητας, αλλά με ένταση πόρων.
Γραμμική ανατροφοδότηση Shift Register


Η μεταβλητή κατάστασης αποθηκεύεται σε έναν καταχωρητή μήκους N. Η δημιουργία της επόμενης κατάστασης περιλαμβάνει δύο βήματα:
  1. Υπολογίζεται η τιμή του bit C = X i1 xor X i2 xor… X ik, όπου i1, i2…ik- καταχωρήστε αριθμούς bit, που καλούνται λυγίζει.
  2. Ο καταχωρητής μετατοπίζεται 1 bit προς τα δεξιά, το πιο αριστερό bit παίρνει την τιμή ΜΕ.
Η έξοδος της γεννήτριας είναι το δεξιότερο (ή το πιο αριστερό ή οποιοδήποτε άλλο) bit του καταχωρητή, δηλαδή η ψευδοτυχαία ακολουθία δημιουργείται ένα bit ανά επανάληψη. Με σωστά επιλεγμένους αριθμούς κρουνών, η περίοδος της γεννήτριας θα είναι 2 N - 1. "Μείον ένα", αφού υπάρχει απαγορευμένη μηδενική κατάσταση του μητρώου. Αριθμοί υποκαταστημάτων για Ναπό 3 έως 168 μπορείτε να δείτε σε αυτό το έγγραφο.
Εκτός από τη διαμόρφωση που περιγράφεται παραπάνω, η οποία, παρεμπιπτόντως, ονομάζεται διαμόρφωση Fibonacci (δεν πρέπει να συγχέεται με την ομώνυμη μέθοδο PRNG!), Υπάρχει ένα λεγόμενο. Διαμόρφωση Galois.


Αντί να χρησιμοποιήσετε το άθροισμα των δυαδικών ψηφίων στην ακολουθία αγγίγματος για να δημιουργήσετε ένα νέο αριστερό bit, XOR κάθε bit της ακολουθίας πατήματος με το δεξιότερο bit και, στη συνέχεια, περιστρέψτε ολόκληρο τον καταχωρητή προς τα δεξιά. Αυτό το σχήμα είναι πιο δύσκολο να γίνει κατανοητό, αλλά πιο εύκολο να εφαρμοστεί, αφού όλες οι λειτουργίες XOR μπορούν να εκτελεστούν ταυτόχρονα. Τα σχήματα Fibonacci και Galois είναι ισοδύναμα ως προς τη διάρκεια περιόδου και την ποιότητα των ψευδοτυχαίων αριθμών.

Πλεονεκτήματα:

  • πολύ απλή υλοποίηση, ακόμα και αριθμητική δεν απαιτείται, μόνο πράξεις και μετατοπίσεις bit.
  • πολύ γρήγορος αλγόριθμος (ειδικά το σχήμα Galois).
  • καλές στατιστικές ιδιότητες.
Μειονεκτήματα:
  • πρέπει να ελέγξετε την αρχική τιμή για ανισότητα μηδέν.
Περίληψη:πολύ γρήγορος και αρκετά υψηλής ποιότητας αλγόριθμος.
Κρυπτο-ανθεκτικοί αλγόριθμοι
Για εφαρμογή στην κρυπτογραφία, το PRNG έχει μια ακόμη βασική απαίτηση: μη αναστρεψιμότητα. Όλοι οι αλγόριθμοι που αναφέρονται παραπάνω δεν έχουν αυτήν την ιδιότητα: γνωρίζοντας πολλές τιμές εξόδου του PRNG, είναι δυνατό, λύνοντας ένα απλό σύστημα εξισώσεων, να βρούμε τις παραμέτρους του αλγορίθμου (οι ίδιες «μαγικές» σταθερές α, β, γκαι τα λοιπά). Και γνωρίζοντας τις παραμέτρους, μπορείτε να αναπαράγετε ολόκληρη την ψευδοτυχαία ακολουθία.
Οποιοσδήποτε επαρκώς ισχυρός κρυπτογράφηση μπλοκ μπορεί να χρησιμοποιηθεί ως κρυπτογραφικά ισχυρός αλγόριθμος PRNG. Επιλέγοντας ένα μυστικό κλειδί, μπλοκ ψευδοτυχαίων αριθμών μπορούν να ληφθούν εφαρμόζοντας τον αλγόριθμο σε διαδοχικούς φυσικούς αριθμούς. Για έναν κρυπτογράφηση μπλοκ N-bit, η περίοδος θα είναι το πολύ 2 N . Η ασφάλεια ενός τέτοιου συστήματος εξαρτάται εξ ολοκλήρου από το απόρρητο του κλειδιού.
Όλοι οι σύγχρονοι κρυπτογραφικοί αλγόριθμοι ελέγχονται για χρήση ως PRNG, δηλαδή, χρησιμοποιώντας έναν πιστοποιημένο αλγόριθμο, δεν χρειάζεται ιδιαίτερη προσοχή στις στατιστικές και φασματικές ιδιότητες του ρεύματος εξόδου. Χρειάζεται μόνο να ανησυχείτε για την υπολογιστική «αθυμία» των αλγορίθμων κρυπτογράφησης. Εάν χρειάζεται να εκτελέσετε μεγάλο αριθμό λειτουργιών κρυπτογράφησης, είναι λογικό να επιλέξετε έναν ελεγκτή με κρυπτογραφικά μπλοκ υλικού. Συχνά σε τέτοιους ελεγκτές υπάρχει επίσης ένα πολύ καλό υλικό PRNG ανθεκτικό στην κρυπτογράφηση.

Πηγές εντροπίας

Όπως ήδη αναφέρθηκε, χρησιμοποιώντας μόνο ντετερμινιστικούς αλγόριθμους, είναι αδύνατο να δημιουργηθεί ένας πραγματικά τυχαίος αριθμός. Ως εκ τούτου, χρησιμοποιείται συνήθως ένα σωρό PRNG + εξωτερικό πηγή εντροπίας. Η πηγή εντροπίας χρησιμοποιείται για τον καθορισμό της αρχικής τιμής για το PRNG και καθήκον του τελευταίου είναι να διασφαλίσει τη φασματική και στατιστική καθαρότητα της ακολουθίας. Τι μπορεί να χρησιμοποιηθεί ως πηγή εντροπίας; Ναι, σχεδόν οτιδήποτε.
Δραστηριότητα χρήστη
Εάν η συσκευή αλληλεπιδρά με τον χρήστη με οποιονδήποτε τρόπο, είναι πολύ καλή ιδέα να χρησιμοποιήσετε τον ίδιο τον χρήστη ως πηγή εντροπίας. Για παράδειγμα, ο χρόνος πατήματος ενός κουμπιού, μετρημένος στο πλησιέστερο μικροδευτερόλεπτο (ή μάλλον, τα λιγότερο σημαντικά ψηφία του), είναι εντελώς απρόβλεπτος. Ωστόσο, συχνά η συσκευή πρέπει να λειτουργεί αυτόνομα, πράγμα που σημαίνει ότι χάνουμε αυτό το υπέροχο κανάλι πληροφοριών.
Μετατροπέας αναλογικού σε ψηφιακό
Πολλοί ελεγκτές έχουν ενσωματωμένους ADC. Και σε πολλά χειριστήρια είναι πολύ μέτριας ποιότητας, φτιαγμένα απλά «για να είναι». Τα χαμηλά bits του αποτελέσματος ADC περιέχουν σχεδόν πάντα σημαντικό θόρυβο, ακόμα κι αν μετράται η τάση DC. Αυτό μπορεί να χρησιμοποιηθεί: συνδέστε την είσοδο του ADC στην τάση τροφοδοσίας μέσω ενός διαιρέτη, κάντε μερικές δεκάδες μετρήσεις, λάβετε τα λιγότερο σημαντικά bits - εδώ είναι ένας εξαιρετικός τυχαίος αριθμός για εσάς. Εάν το ADC περιέχει ενσωματωμένο προενισχυτή, ενεργοποιήστε τον, κάνει επίσης θόρυβο.
Ασύγχρονες γεννήτριες
Μπορείτε να χρησιμοποιήσετε τη διαφορά περιόδου δύο μη συγχρονισμένων ρολογιών. Οι περισσότεροι ελεγκτές περιέχουν, για παράδειγμα, ένα χρονόμετρο παρακολούθησης. Για να βελτιωθεί η αξιοπιστία, χρονομετρείται από έναν ξεχωριστό ταλαντωτή που δεν είναι συνδεδεμένος με κανέναν τρόπο στο κύριο σήμα ρολογιού. Αρκεί να μετρήσετε τον αριθμό των κύκλων του κύριου σήματος ρολογιού σε μια περίοδο του χρονοδιακόπτη παρακολούθησης. Εάν επιλέξετε τις περιόδους έτσι ώστε ο μετρητής να υπερχειλίζει πολλές φορές κατά τη διάρκεια της μέτρησης, μπορείτε να πάρετε έναν αρκετά τυχαίο αριθμό. Το μειονέκτημα αυτής της μεθόδου είναι ότι διαρκεί πολύ χρόνο, έως και αρκετά δευτερόλεπτα.
Ρολόι πραγματικού χρόνου
Εάν το σχήμα έχει Ρολόι πραγματικού χρόνου, μπορείτε να χρησιμοποιήσετε τις τρέχουσες αναγνώσεις τους για να αρχικοποιήσετε το PRNG. Για παράδειγμα, μετατρέποντας την τρέχουσα ημερομηνία/ώρα στη μορφή ώρας Unix, παίρνουμε αμέσως 32 bit, τα οποία ποτέδεν θα εμφανιστεί ξανά, εκτός εάν κάνετε μετρήσεις περισσότερες από μία φορές το δευτερόλεπτο. Η χρήση πραγματικού χρόνου δίνει μοναδικότητα στις αξίες, αλλά δεν δίνει κανένα απρόβλεπτο, επομένως είναι καλύτερο να συνδυάσετε με αυτόν τον τρόπομε άλλους.
Κύκλωμα RC
Εάν ο ελεγκτής δεν έχει κανένα περιφερειακά, εκτός από τις θύρες I / O, μπορείτε να κάνετε τα εξής: ένα από τα πόδια συνδέεται μέσω ενός πυκνωτή στο έδαφος και μέσω μιας αντίστασης - στην τάση τροφοδοσίας. Εάν οι είσοδοι του ελεγκτή έχουν εσωτερικές αντιστάσεις έλξης, δεν απαιτείται εξωτερική αντίσταση.

Εξάγουμε ένα σήμα "0" σε αυτή τη θύρα - ο πυκνωτής αποφορτίζεται. Αλλάζουμε τη θύρα στη λειτουργία εισόδου - ο πυκνωτής αρχίζει να φορτίζει. Όταν η τάση σε αυτό φτάσει στο όριο, η είσοδος θα αλλάξει από την κατάσταση "0" σε "1". Ο χρόνος φόρτισης εξαρτάται σε μεγάλο βαθμό από πολλούς παράγοντες: τάση τροφοδοσίας, μετατόπιση παραμέτρων κυκλώματος RC, αστάθεια κατωφλίου, θερμοκρασία, διαρροή, θόρυβος. Μετρώντας το με επαρκή ακρίβεια και λαμβάνοντας τα λιγότερο σημαντικά bits, μπορείτε να έχετε καλή τυχαιότητα.
Γεννήτρια θορύβου υλικού
Για πολλές σοβαρές εφαρμογές (κυρίως κρυπτογραφία), απαιτείται μια πιο αξιόπιστη πηγή εντροπίας από αυτές που αναφέρονται παραπάνω. Σε τέτοιες περιπτώσεις, το σήμα ψηφιοποιείται από μια γεννήτρια θορύβου με βάση θερμικά, πυροβολικά ή ακόμα και κβαντικά αποτελέσματα. Το θορυβώδες στοιχείο είναι συνήθως μια ειδική δίοδος ή δίοδος zener, το σήμα από την οποία ενισχύεται και τροφοδοτείται σε έναν συγκριτή που σχηματίζει ένα δυαδικό ρεύμα bit.

Προκειμένου το όριο απόκρισης του συγκριτή να μην επηρεάζει τις στατιστικές ιδιότητες του λαμβανόμενου σήματος, χρησιμοποιούνται δύο γεννήτριες θορύβου που λειτουργούν σε έναν συγκριτή:

συμπέρασμα

Τέλος, θα σας πω μια ιστορία από τη ζωή μου. Ξεκίνησε με μια άλλη ερώτηση που τέθηκε στο φόρουμ "πώς μπορώ να δημιουργήσω έναν τυχαίο αριθμό στον ελεγκτή;". Ο συγγραφέας της ερώτησης εξήγησε τι κάνει η συσκευή που μιμείται τη ρίψη ζαριών ως έργο μαθημάτων. Μετά από αρκετές ανεπιτυχείς προσπάθειες να καταλάβει τους αλγόριθμους, ο topikstarter μοιράστηκε τη λύση του: απλά έριξε ένα πραγματικό ζάρι 1000 φορές και σημείωσε όλη την ελεύθερη μνήμη του ελεγκτή με τους αριθμούς που προέκυψαν. Η γεννήτρια πέρασε όλες τις δοκιμές για «τυχαιότητα» με έντονο χρώμα, δεδομένου ότι κατανάλωσε λιγότερο από το ένα τρίτο του «αποθέματος» της κατά τη διάρκεια της επίδειξης.
Επομένως, μια τέτοια λύση έχει επίσης δικαίωμα στη ζωή, ειδικά εάν επιβάλλονται πολύ αυστηρές απαιτήσεις για την τυχαιότητα των αριθμών, αλλά δεν απαιτούνται πολύ συχνά. Καθώς οι τιμές της μνήμης πέφτουν κατακόρυφα, ίσως είναι συνετό να εφοδιαστείτε μια συσκευή με μονάδα flash "chaos headroom" που θα διαρκέσει για όλη τη διάρκεια ζωής της συσκευής.
Ευχαριστώ για την προσοχή!

UPD1:Όπως σωστά σημειώθηκε στα σχόλια, εάν υποτίθεται ότι μια επίθεση στο RNG και ο εισβολέας έχει πρόσβαση υλικού στη συσκευή, οι εξωτερικές πηγές εντροπίας θα πρέπει να χρησιμοποιούνται με μεγάλη προσοχή, καθώς δεν είναι πολύ δύσκολο να αντικατασταθεί το σήμα από εξωτερική πηγή. Θα πρέπει να χρησιμοποιηθεί εσωτερικές πηγές, μπορεί να είναι επιπλέον του εξωτερικού.
Είναι επίσης καλή ιδέα να συσσωρεύσετε την εντροπία των πάντων ελεύθερος χρόνοςκαι χρησιμοποιήστε το όταν χρειάζεται να δημιουργήσετε έναν άλλο τυχαίο αριθμό. Συνήθως σε τέτοιες περιπτώσεις, τα λεγόμενα. Πισίνα εντροπίας- ένας πίνακας στον οποίο εκτελείται περιοδικά μία από τις συναρτήσεις PRNG και όπου τα δεδομένα από πηγές εντροπίας αναμιγνύονται συνεχώς.

UPD2:Σε πολλές περιπτώσεις, είναι χρήσιμο να αποθηκεύσετε τα περιεχόμενα του χώρου συγκέντρωσης Entropy (συγγνώμη, δεν γνωρίζω την κανονική ρωσική μετάφραση) στο EEPROM για να μην συσσωρευτεί ξανά μετά την απενεργοποίηση και την ενεργοποίηση της συσκευής. Αυτό ισχύει, πρώτα απ 'όλα, για τη λήψη εντροπίας με τη μέθοδο των ασύγχρονων γεννητριών: κάτω από επαρκώς σταθερές συνθήκες, μετά από κάθε ενεργοποίηση, μπορεί να δημιουργηθεί η ίδια ακολουθία.
Εάν αναμένεται επίθεση, λάβετε προφυλάξεις κατά της παραβίασης του περιεχομένου του EEPROM. Εάν το επιτρέπει ο ελεγκτής, μπλοκάρετε την ανάγνωση / διαγραφή / εγγραφή χρησιμοποιώντας bits κλειδώματος, όταν είναι ενεργοποιημένο, ελέγξτε την ακεραιότητα του EEPROM, τουλάχιστον χρησιμοποιώντας τα πιο απλά αθροίσματα ελέγχου.

Ετικέτες:

  • rfc
  • gpsch
  • μικροελεγκτές
  • αλγόριθμους
Προσθέστε ετικέτες

τυχαίος σπόρος (σπόρος)

Ορίζει μια τιμή, ή ένα seed, ως το σημείο εκκίνησης της συνάρτησης random().

randomSeed(value); // ορίζει την 'τιμή' ως αρχική τυχαία τιμή

Δεδομένου ότι το Arduino δεν μπορεί να δημιουργήσει πραγματικά τυχαίους αριθμούς, το randomSeed σάς επιτρέπει να βάλετε μια μεταβλητή, σταθερά ή άλλη συνάρτηση στην τυχαία συνάρτηση, η οποία βοηθά στη δημιουργία περισσότερων τυχαίων αριθμών.

«τυχαίους» αριθμούς. Υπάρχουν πολλοί διαφορετικοί σπόροι ή συναρτήσεις που μπορούν να χρησιμοποιηθούν σε αυτήν τη συνάρτηση, συμπεριλαμβανομένων των millis(), ή ακόμα και της analogRead() για την ανάγνωση του ηλεκτρικού θορύβου μέσω μιας αναλογικής ακίδας.

τυχαία (μέγ.)

τυχαία (ελάχ., μέγ.)

Η τυχαία συνάρτηση σάς επιτρέπει να επιστρέψετε έναν ψευδοτυχαίο αριθμό εντός του εύρους που δίνεται από τις ελάχιστες και μέγιστες τιμές.

τιμή = τυχαία(100, 200); // ορίζει την 'τιμή' σε τυχαία

// ένας αριθμός μεταξύ 100 και 200

Σημείωση:Χρησιμοποιήστε το αφού χρησιμοποιήσετε τη συνάρτηση randomSeed(). Το ακόλουθο παράδειγμα δημιουργεί έναν τυχαίο αριθμό μεταξύ 0 και 255 και δίνει έξοδο PWM

σήμα στην έξοδο PWM ίσο με τυχαία τιμή:

int randNumber; // μεταβλητή για την αποθήκευση μιας τυχαίας τιμής

int led = 10; // LED με αντίσταση στον ακροδέκτη 10

void setup() () // δεν απαιτείται εγκατάσταση

randomSeed(millis()); // ορίζει τη millis() ως σπόρο

randNumber = τυχαίο(255); // τυχαίος αριθμός από 0 - 255 analogWrite(led, randNumber); // έξοδος σήματος PWM

καθυστέρηση (500); // παύση μισό δευτερόλεπτο

Πηγή: Gololobov V. - Πού ξεκινούν τα ρομπότ. Σχετικά με το έργο Arduino για μαθητές (και όχι μόνο) - 2011

σχετικές αναρτήσεις

Serial.begin (rate) Ανοίγει τη σειριακή θύρα και ορίζει τον ρυθμό για τη σειριακή μεταφορά δεδομένων. Ο τυπικός ρυθμός baud για επικοινωνία υπολογιστή είναι 9600, αν και υποστηρίζονται άλλοι ρυθμοί baud. void setup()( Serial.begin…….

Όλες οι μεταβλητές πρέπει να δηλωθούν πριν χρησιμοποιηθούν. Η δήλωση μιας μεταβλητής σημαίνει τον ορισμό του τύπου της τιμής της: int, long, float, κ.λπ., ορίζοντας ένα μοναδικό όνομα μεταβλητής και επιπλέον…….

Εντάξει, εγκαταστήσαμε αυτό το πρόγραμμα. Έχουμε διορθώσει τον «μηχανισμό» της εργασίας με τη μονάδα. Και δείτε μερικά παραδείγματα. Αλλά θα ήθελα να δημιουργήσω κάτι χρήσιμο μόνος μου. Ας δοκιμάσουμε. Ας κλείσουμε πρώτα το προηγούμενο έργο. Για αυτό…….

Προσοχή! Όταν εργάζεστε με τη μονάδα Arduino σε άλλα περιβάλλοντα ανάπτυξης, θα πρέπει να είστε προσεκτικοί σχετικά με τη διαμόρφωση του μικροελεγκτή (Ασφάλειες). Μέχρι να μάθετε ακριβώς σε τι μπορεί να οδηγήσει η αλλαγή…….

Χρόνος και τυχαίος. Αντίδραση

Αυτή τη φορά θα μάθουμε ποιες είναι οι "Τυχαίες" τιμές και επίσης θα μάθουμε πώς να δουλεύουμε με τον χρόνο.

Θα χρειαστούμε:

  • Κουμπί ρολογιού
  • τρίζων
  • Καλώδια σύνδεσης "PAPA-PAPA"

Αντίδραση

Το καθήκον μας για σήμερα είναι να συναρμολογήσουμε ένα κύκλωμα που μας επιτρέπει να μάθουμε την ταχύτητα της αντίδρασής μας.

Όταν πατάτε το αριστερό κουμπί, ακούγεται ένα σήμα μετά από μια "τυχαία" ώρα. Και όταν πατήσετε το δεξί κουμπί, σημειώνεται πόσος χρόνος έχει περάσει από το τρίξιμο μέχρι το πάτημα του δεξιού κουμπιού.

Ποιος είναι επιδέξιος - το δοκιμάζει ο ίδιος, και εξετάζουμε το σχέδιο.

#define BUZ 8 #define START 9 #define STOP 7 int time; // Μεταβλητή για συγχρονισμό void setup() ( Serial. start(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() (if(digitalRead(START) == 0) // Όταν πατάτε το κουμπί START.. ( int start_time = millis();// Θυμηθείτε τον χρόνο πατήματος = start_time; // Γράψτε τον σε μια καθολική μεταβλητή. int Rand = random(0, 4000) ; // Δημιουργήστε έναν "τυχαίο" χρόνο καθυστέρησης = χρόνο + Ραντ; //Προσθήκη της καθυστέρησης χρόνου καθυστέρησης (Rand); //Ήχος αναμονής (BUZ, 3000, 500); //Μπιπ! ) if(digitalRead(STOP) = = 0 && digitalRead( START) == 1)// Όταν πατάτε το κουμπί STOP... ( int stop_time = millis(); //Θυμηθείτε τον χρόνο διακοπής. time = stop_time - time; // Υπολογίστε τη διαφορά ώρας. Σειριακή .println("Time:"); // Εκτύπωση της ώρας σε Serial. Serial. println(time); delay(1000); ) ) // Πριν από τη δεύτερη προσπάθεια, πατήστε ξανά το κουμπί START.

Εξηγήσεις

ενθ χρόνος; Στις μεταβλητές (όχι όλες), όταν προσδιορίζονται, δεν χρειάζεται να εκχωρηθεί καμία τιμή. Χρησιμοποιήσαμε αυτή τη μεταβλητή για να συνδέσουμε δύο προτάσεις if.

Στη C++, οι μεταβλητές που δηλώνονται μέσα σε έναν βρόχο δεν θα είναι διαθέσιμες σε άλλους βρόχους, καθώς ισχύουν μόνο εντός αυτού του βρόχου. Αυτό γίνεται για να αποφευχθούν σφάλματα προγραμματισμού. Όταν μεγαλώσει ο κώδικας του προγράμματος, θα καταλάβετε για τι πράγμα μιλάω.

Για να κάνετε μια μεταβλητή διαθέσιμη σε πολλές δηλώσεις, πρέπει να την κάνετε καθολική. Εκείνοι. Δηλώστε μια μεταβλητή εκτός συναρτήσεων.

millis();Επιστρέφει τον αριθμό των χιλιοστών του δευτερολέπτου που έχουν περάσει από την έναρξη του προγράμματος.

Το χρειαζόμαστε για να μετρήσουμε το χρόνο που μεσολάβησε από τη σηματοδότηση μέχρι το πάτημα του κουμπιού.

τυχαίος(min,Μέγιστη);Είναι μια "τυχαία" γεννήτρια αριθμών. Παίρνει δύο τιμές. Δημιουργεί έναν αριθμό μεταξύ min και max.

«Τυχαίοι» αριθμοί γιατί είναι μια συγκεκριμένη ακολουθία τιμών. Πολύ μεγάλο, αλλά το ίδιο. Για να λάβετε διαφορετικές ακολουθίες, θα πρέπει να χρησιμοποιήσετε ΤυχαίοςΣπόρος();

Αυτή, η συνάρτηση, αρχικοποιεί τη γεννήτρια. Και αν ορίσετε την παράμετρο σε τυχαία, τότε θα λάβουμε τις ακολουθίες που χρειαζόμαστε. Η ίδια ακολουθία θα είναι εάν η παράμετρος είναι σταθερή.

συμπέρασμα

Τώρα μπορείτε να εκπαιδεύσετε την αντίδρασή σας με τη βοήθεια της δικής σας συσκευής. Και μπορείς να συνεχίσεις.

Λίστα ραδιοφωνικών στοιχείων

Ονομασία Τύπος Ονομασία Ποσότητα ΣημείωσηΚατάστημαΤο σημειωματάριό μου
Πλακέτα Arduino

Arduino Uno

1 Στο σημειωματάριο
Ψωμί σανίδαBreadboard-μισό1 Στο σημειωματάριο
Piezo buzzerΠαθητικός1 Στο σημειωματάριο
Κουμπί ρολογιούΧωρίς συγκράτηση2 Στο σημειωματάριο
Καλώδια σύνδεσης"Παππά Παπά"1



Μπλουζα