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

10.09.2021

randomSeed(seed)

Ορίζει την τιμή ή το 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, αν και υποστηρίζονται άλλες ταχύτητες. void setup() (Serial.begin…….

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

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

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

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

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

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

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

Αντίδραση

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

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

Όσοι είναι επιδέξιοι το δοκιμάζουν μόνοι τους, και βλέπουμε το διάγραμμα.

#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 // Ας δημιουργήσουμε έναν "τυχαίο" χρόνο καθυστέρησης = χρόνος + Ραντ //Προσθήκη χρόνου καθυστέρησης (BUZ, 3000, 500) == 0; digitalRead( START) == 1) // Όταν πατάτε το κουμπί STOP... ( int stop_time = millis(); // Θυμηθείτε τον χρόνο διακοπής. time = stop_time - time; // Υπολογίστε τη διαφορά ώρας. Serial.println ("Time: ") // Έξοδος του χρόνου σε Serial.println(καθυστέρηση) ) // Πριν από τη δεύτερη προσπάθεια, πατήστε ξανά το κουμπί START.

Εξηγήσεις

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

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

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

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

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

τυχαίος(min,μέγιστο);Αυτή είναι μια γεννήτρια τυχαίων αριθμών. Παίρνει δύο τιμές. Δημιουργεί έναν αριθμό στο εύρος από το ελάχιστο έως το μέγιστο.

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

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

Σύναψη

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

Κατάλογος ραδιοστοιχείων

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

Arduino Uno

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

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



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


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


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


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


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


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

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

Αξιολόγηση της «τυχαιότητας»

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

Αλγόριθμοι PRNG

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

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

  • τη μέγιστη δυνατή περίοδο για ένα δεδομένο μέγεθος της μεταβλητής κατάστασης·
  • αρκετά γρήγορα?
  • συχνά ήδη υλοποιείται στη βιβλιοθήκη του μεταγλωττιστή.
Μειονεκτήματα:
  • απαιτείται μια λειτουργία πολλαπλασιασμού.
  • δεν είναι όλα τα bit εξίσου τυχαία.
Περίληψη:ένας γρήγορος και απλός αλγόριθμος για όχι πολύ απαιτητικές εφαρμογές.
Μέθοδος Fibonacci με καθυστερήσεις
Αυτός ο αλγόριθμος χρησιμοποιεί τη σχέση
X i = 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 στην ακολουθία tap για να δημιουργήσει ένα νέο πιο αριστερό bit, XORs κάθε bit στην ακολουθία tap με το δεξιότερο bit και, στη συνέχεια, περιστρέφει ολόκληρο τον καταχωρητή προς τα δεξιά. Αυτό το σχήμα είναι πιο δύσκολο να γίνει κατανοητό, αλλά πιο εύκολο να εφαρμοστεί, αφού όλες οι λειτουργίες XOR μπορούν να εκτελεστούν ταυτόχρονα. Όσον αφορά τη διάρκεια περιόδου και την ποιότητα των ψευδοτυχαίων αριθμών, τα σχήματα Fibonacci και Galois είναι ισοδύναμα.

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

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

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

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

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

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

Σύναψη

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

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

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

Ετικέτες:

  • RNG
  • gpsch
  • μικροελεγκτές
  • αλγόριθμους
Προσθήκη ετικετών