Arduino შემთხვევითი რიცხვების ფუნქცია. შემთხვევითი რიცხვების გენერირება მიკროკონტროლერებზე

10.09.2021

შემთხვევითი თესლი (თესლი)

აყენებს მნიშვნელობას ან seed-ს, როგორც საწყის წერტილს random() ფუნქციისთვის.

randomSeed(მნიშვნელობა); // ადგენს 'მნიშვნელობას' როგორც საწყის შემთხვევით მნიშვნელობას

ვინაიდან 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 (სიჩქარე) ხსნის სერიულ პორტს და ადგენს სერიული მონაცემების გადაცემის სიჩქარეს. ტიპიური ბაუდის სიჩქარე კომპიუტერული კომუნიკაციებისთვის არის 9600, თუმცა სხვა სიჩქარეები მხარდაჭერილია. void setup() (Serial.begin…….

ყველა ცვლადი უნდა იყოს გამოცხადებული, სანამ ისინი გამოიყენებენ. ცვლადის გამოცხადება ნიშნავს მისი მნიშვნელობის ტიპის განსაზღვრას: int, long, float და ა.შ., ცვლადისთვის უნიკალური სახელის მინიჭებას და დამატებით…….

კარგი, ჩვენ დავაინსტალირეთ ეს პროგრამა. ჩვენ გავმართეთ მოდულთან მუშაობის „მექანიზმი“. და ჩვენ გადავხედეთ რამდენიმე მაგალითს. მაგრამ მე თვითონ მინდა შევქმნა რაიმე სასარგებლო. ვცადოთ. ჯერ დავხუროთ წინა პროექტი. ამისთვის…….

ყურადღება! -თან მუშაობისას Arduino მოდულიგანვითარების სხვა გარემოში, ფრთხილად უნდა იყოთ მიკროკონტროლერის კონფიგურაციაზე (Fuses). სანამ არ გეცოდინებათ, რა შეიძლება გამოიწვიოს ცვლილებამ…….

დრო და შემთხვევითობა. რეაქცია

ამჯერად გავიგებთ რა არის „შემთხვევითი“ მნიშვნელობები და ასევე ვისწავლით როგორ ვიმუშაოთ დროსთან.

ჩვენ დაგვჭირდება:

  • ტაქტის ღილაკი
  • სკიერი
  • სადენების დამაკავშირებელი „MALE-MALE“

რეაქცია

ჩვენი დღევანდელი ამოცანაა შევკრიბოთ დიაგრამა, რომელიც საშუალებას მოგვცემს გავარკვიოთ ჩვენი რეაქციის სიჩქარე.

როცა დააწკაპუნებთ მარცხენა ღილაკისიგნალი ჟღერს „შემთხვევითი“ დროის შემდეგ. ხოლო მარჯვენა ღილაკზე დაჭერისას აღინიშნა რამდენი დრო გავიდა ჩხუბიდან მარჯვენა ღილაკზე დაჭერამდე.

ვინც დახელოვნებულია, თვითონ სცადა, ჩვენ კი დიაგრამას ვუყურებთ.

#define BUZ 8 #define START 9 #define STOP 7 int time; //ცვლადი სინქრონიზაციისთვის void setup() ( სერიული. დასაწყისი (9600); pinMode (START, INPUT_PULLUP); pinMode (STOP, INPUT_PULLUP); pinMode (BUZ, OUTPUT); ) void loop() (if(digitalRead(START) == 0) // როდესაც დააჭერთ დაწყებას ღილაკს.. ( int start_time = millis(); // დაიმახსოვრე დაჭერის დრო = start_time; // ჩაწერეთ იგი გლობალურ ცვლადში. int Rand = random(0, 4000 // შევქმნათ "შემთხვევითი" დაყოვნების დრო = დრო + რენდი //დავამატოთ დაყოვნების დრო(BUZ, 3000, 500) == 0; digitalRead( START) == 1) // როდესაც დააჭირეთ STOP ღილაკს... ( int stop_time = millis(); // გახსოვდეთ გაჩერების დრო. დრო = stop_time - დრო; // გამოთვალეთ დროის სხვაობა. Serial.println ("Time:");

ახსნა-განმარტებები

ინტ დრო; ცვლადებს (არა ყველა), მათი აღნიშვნისას, არ უნდა მიენიჭოთ რაიმე მნიშვნელობა. ჩვენ გამოვიყენეთ ეს ცვლადი ორი if განცხადების დასაკავშირებლად.

C++-ში, ციკლის შიგნით გამოცხადებული ცვლადები არ იქნება ხელმისაწვდომი სხვა მარყუჟებში, რადგან მათ აქვთ ეფექტი მხოლოდ ამ ციკლში. ეს კეთდება პროგრამირების შეცდომების თავიდან ასაცილებლად. როცა პროგრამის კოდი გაიზრდება, მიხვდებით რაზეც ვსაუბრობ.

იმისთვის, რომ ცვლადი ხელმისაწვდომი იყოს მრავალი განცხადებისთვის, თქვენ უნდა გახადოთ ის გლობალური. იმათ. გამოაცხადეთ ცვლადი ფუნქციების გარეთ.

millis();აბრუნებს პროგრამის გაშვებიდან გასულ მილიწამების რაოდენობას.

ჩვენ გვჭირდება, რათა გავზომოთ დრო, რომელიც გავიდა სიგნალის მიცემიდან ღილაკზე დაჭერამდე.

შემთხვევითი (წთ,მაქს);ეს არის შემთხვევითი რიცხვების გენერატორი. იღებს ორ მნიშვნელობას. ის წარმოქმნის რიცხვს მინ-დან მაქსიმუმამდე დიაპაზონში.

"შემთხვევითი" რიცხვები, რადგან ისინი მნიშვნელობების სპეციფიკური თანმიმდევრობაა. ძალიან გრძელი, მაგრამ იგივე. იმისათვის, რომ მიიღოთ სხვადასხვა თანმიმდევრობა, თქვენ უნდა გამოიყენოთ შემთხვევითიSeed();

ეს ფუნქცია ახდენს გენერატორის ინიციალიზაციას. და თუ პარამეტრს დავაყენებთ შემთხვევით, მაშინ მივიღებთ ჩვენთვის საჭირო თანმიმდევრობებს. თანმიმდევრობა იგივე იქნება, თუ პარამეტრი დაფიქსირდა.

დასკვნა

ახლა თქვენ შეგიძლიათ მოამზადოთ თქვენი რეაქცია თქვენს მიერ შექმნილი მოწყობილობის გამოყენებით. ან შეგიძლიათ განაგრძოთ შემდგომი სწავლა.

რადიოელემენტების სია

აღნიშვნა ტიპი დასახელება რაოდენობა შენიშვნამაღაზიაჩემი ბლოკნოტი
არდუინოს დაფა

არდუინო უნო

1 რვეულში
განვითარების საბჭოპურის დაფა-ნახევარი1 რვეულში
პიეზო ემიტერიპასიური1 რვეულში
ტაქტის ღილაკიჩაკეტვის გარეშე2 რვეულში
დამაკავშირებელი სადენები"პაპა-პაპა"1

ზე Arduino პროგრამირებაარის შემთხვევები, როცა უნდა მიიღოთ ნომერი, რომელიც წინასწარ არ იქნება ცნობილი არც პროგრამისტისთვის, რომელიც წერს ესკიზს და არც იმ მომხმარებელს, რომელიც გამოიყენებს Arduino-ს ასეთი პროგრამით. ამ შემთხვევაში, შემთხვევითი (უფრო სწორად ფსევდო შემთხვევითი) რიცხვების გენერატორი მოდის სამაშველოში.



ამ გენერატორის გასააქტიურებლად, უბრალოდ გამოიყენეთ random() ან randomSeed() ფუნქციები. ეს მასალა გაჩვენებთ, თუ როგორ უნდა იმუშაოთ ამ ფუნქციებთან, ასევე როგორ მოიცილოთ ფსევდო შემთხვევითობა რიცხვების გენერირებისას.


ზოგადად, ფსევდო შემთხვევითი რიცხვების გენერატორი ახდენს რიცხვების ქაოტურ ან შემთხვევით გარეგნობის სიმულაციას, მაგრამ სინამდვილეში, თუ ამ რიცხვების სერიას საკმარისად ხანგრძლივი პერიოდის განმავლობაში გაანალიზებთ, შეამჩნევთ გარკვეულ შაბლონს.


ასე რომ, ფსევდო შემთხვევითი რიცხვების გენერირების შემთხვევითი ფუნქცია შეიძლება ჰქონდეს ორ პარამეტრამდე და იწერება როგორც შემთხვევითი (მაქს) ან შემთხვევითი (მინ, მაქსიმუმი). აქ მაქსიმალური პარამეტრი, რომელიც სავალდებულოა, ადგენს ფსევდო შემთხვევითი რიცხვების გენერირების დიაპაზონის ზედა ზღვარს. დამატებითი min პარამეტრის გამოყენებით, შეგიძლიათ დააყენოთ დიაპაზონის ქვედა ზღვარი. შედეგად, ფუნქცია დააბრუნებს ფსევდო შემთხვევით რიცხვს მინ-დან მაქსიმუმ-1-მდე დიაპაზონში.


მნიშვნელოვანია გვესმოდეს, რომ random() ფუნქციის გამოყენებისას ყოველ ჯერზე წარმოიქმნება ფსევდო შემთხვევითი რიცხვების ზუსტად იგივე სია. მაგალითად, თუ აკეთებთ სათამაშო მანქანა, და პირველად დააჭერთ სახელურს, გამოჩნდება მომგებიანი კომბინაცია, შემდეგ შეგიძლიათ დარწმუნებული იყოთ, რომ თუ გადატვირთავთ Arduino-ს და ხელახლა დააჭერთ სახელურს, ეს სათამაშო მანქანა აჩვენებს იგივე მომგებიან კომბინაციას. ნამდვილად არ არის ადვილი სათამაშო აპარატის დანერგვა სრულიად შემთხვევითი რიცხვების გენერირებით Arduino-ზე, როგორც ეს არის, მაგალითად, დანერგილი სათამაშო მანქანებში www.igrovye-apparati-vulcan.com/, მაგრამ თქვენ შეგიძლიათ ნაწილობრივ მოაგვაროთ პრობლემა randomSeed-ის გამოყენებით. () ფუნქცია.


ეს ფუნქცია იღებს მნიშვნელობას (მაგალითად, მთელ რიცხვს) და იყენებს რიცხვს შემთხვევითი სიის შესაცვლელად, რომელიც წარმოიქმნება random() ფუნქციით. მარყუჟი. მაგრამ მაშინაც კი, მთავარი ის არის, რომ მიუხედავად იმისა, რომ შემთხვევითი რიცხვების თანმიმდევრობა განსხვავებული იქნება randomSeed() ფუნქციის გამოყენებისას, ის მაინც იგივე იქნება ყოველ ჯერზე, როდესაც ესკიზის გაშვება მოხდება.


ერთადერთი გამოსავალი ამ შემთხვევაში შეიძლება იყოს ანალოგური პერიფერიული მოწყობილობების (ADC) და შესაბამისი analogRead() ფუნქციის გამოყენება. თუ ანალოგური შეყვანა არაფერთან არის დაკავშირებული, ანუ ჰაერში „ჩაკიდებული“ დარჩა, მაშინ ამ ხაზის ხმაურის წყალობით შეგიძლიათ მიიღოთ მართლაც შემთხვევითი რიცხვები. შემდეგ შიგნით დაყენების დაყენებაშეგიძლიათ დაწეროთ ასე: randomSeed(analogRead(A0)). იმ პირობით, რომ ანალოგური პორტი A0 არსად არ არის დაკავშირებული.

ბევრი დაიწერა შემთხვევითი რიცხვების გენერატორების შესახებ, მაგრამ თითქმის ყოველთვის, როდესაც საქმე ეხება განხორციელებას, იგულისხმება (ან პირდაპირ არის ნათქვამი), რომ საუბარია x86/x64 და სხვა „ზრდასრული“ არქიტექტურებზე. ამავდროულად, მიკროკონტროლერებზე მოწყობილობების შემუშავებისადმი მიძღვნილი ფორუმები სავსეა კითხვებით „როგორ შემიძლია შემთხვევითი რიცხვის გენერირება %controllername%–ზე?“ უფრო მეტიც, პასუხების დიაპაზონი ვრცელდება „Google-ის/ვიკიპედიის ნახვა“ „სტანდარტული ფუნქციის გამოყენებამდე“. ეს ყოველთვის ასე არ არის სტანდარტული ფუნქცია» არსებობს და ერგება დეველოპერს ყველა ასპექტში, უფრო ხშირად პირიქით: ზოგჯერ რიცხვები შორს არის შემთხვევითისაგან, ზოგჯერ ოპერაციის სიჩქარე ძალიან დაბალია, ან ზოგჯერ მიღებული კოდი საერთოდ არ ჯდება თავისუფალ მეხსიერებაში.
შევეცადოთ გაერკვნენ, თუ რა არის შემთხვევითი რიცხვების წარმოქმნის ალგორითმები, როგორ ავირჩიოთ სწორი და რაც მთავარია, რა თვისებები აქვს ამ ალგორითმების კონტროლერებზე დანერგვას.

"შემთხვევითობის" შეფასება

RNG-ის აპლიკაციები შეიძლება ძალიან განსხვავებული იყოს, სათამაშოებიდან სერიოზულ კრიპტოგრაფიამდე. შესაბამისად, გენერატორის მოთხოვნებიც ძალიან განსხვავდება. არსებობს სპეციალური ტესტები გენერატორის ხარისხის შესაფასებლად („შემთხვევითობის“ დონე). აქ არის ყველაზე ძირითადი მათგანი:
  • სიხშირის ტესტი. შედგება ნულებისა და ერთეულების რაოდენობის დათვლისგან ბიტების თანმიმდევრობით. უნდა იყოს დაახლოებით თანაბარი რიცხვი ერთი და ნული.
  • შეამოწმეთ იდენტური ბიტების თანმიმდევრობა. იძებნება იდენტური ბიტების რიგები, როგორიცაა 000...0 ან 111...1. სიხშირეების განაწილება, რომლითაც ხდება სერია, მათი სიგრძის მიხედვით, უნდა შეესაბამებოდეს ამ განაწილებას ჭეშმარიტად შემთხვევითი სიგნალისთვის.
  • სპექტრული ტესტი. ვრცელდება თავდაპირველ თანმიმდევრობაზე დისკრეტული ტრანსფორმაციაფურიე. მიღებულ სპექტრს არ უნდა ჰქონდეს მნიშვნელოვანი მწვერვალები, რაც მიუთითებს თანმიმდევრობის პერიოდული თვისებების არსებობაზე.
  • ავტოკორელაციის ტესტი. გამოითვლება კორელაციის მნიშვნელობა ერთმანეთთან შედარებით გადანაცვლებულ თანმიმდევრულ ასლებს შორის. ტესტი საშუალებას გაძლევთ იპოვოთ განმეორებადი რეგიონები თანმიმდევრობით.
არსებობს სპეციალური ნაკრები, რომელიც მოიცავს ათობით მსგავს ტესტს:
NIST - გამოიყენება AES კონკურსში დაშიფვრის ალგორითმების შესაფასებლად.
DIEHARD არის ერთ-ერთი ყველაზე მკაცრი ნაკრები.

PRNG ალგორითმები

მკაცრად განსაზღვრული ალგორითმის მიხედვით გენერირებული ნებისმიერი თანმიმდევრობა არ შეიძლება ჩაითვალოს ჭეშმარიტად შემთხვევითად, ამიტომ ალგორითმულ გენერატორებზე საუბრისას იყენებენ ტერმინს. ფსევდორანდომობაშემდგომი მიმდევრობა. ნებისმიერი ფსევდო შემთხვევითი რიცხვების გენერატორი (PRNG) ადრე თუ გვიან ამოქმედდება, სხვა ის არის, რომ ეს „გვიან“ შეიძლება რამდენიმე მილიწამში, ან შესაძლოა რამდენიმე წელიწადში მოვიდეს. ციკლის ხანგრძლივობა დამოკიდებულია N გენერატორის შიდა მდგომარეობის ზომაზე (სინამდვილეში, ეს არის გენერატორისთვის საჭირო მეხსიერების რაოდენობა) და მერყეობს 2 (N/2)-დან 2 N ბიტამდე.
გამოიგონეს PRNG ალგორითმის უზარმაზარი მრავალფეროვნება, მაგრამ ყველა მათგანი არ არის მოსახერხებელი მიკროკონტროლერებზე განსახორციელებლად. ჩვენ სასტიკად შეზღუდული ვართ სიჩქარით და ხელმისაწვდომი მეხსიერებით, ბევრი კონტროლერი არ უჭერს მხარს რეალურ არითმეტიკას ან თუნდაც გამრავლების ინსტრუქციებს. ამ შეზღუდვების გათვალისწინებით, მოდით გადავხედოთ რამდენიმე ცნობილ ალგორითმს.
წრფივი თანმიმდევრული მეთოდი
თანმიმდევრობის შემდეგი წევრი გამოითვლება ფორმულის გამოყენებით
X i+1 = (aX i + c) მოდ მ
ნომერი განსაზღვრავს მიმდევრობის მაქსიმალურ პერიოდს, მთელ რიცხვებს და - "ჯადოსნური" კოეფიციენტები. ნომერი მიზანშეწონილია აირჩიოთ ორი სიმძლავრის ტოლი ამ შემთხვევაში, მოდულის კონვერტაციის ოპერაცია მცირდება ყველაზე მნიშვნელოვანი ბიტების გაუქმებამდე. მაქსიმალური პერიოდის მისაღებად, შემდეგი პირობები უნდა დაკმაყოფილდეს:
- და m უნდა იყოს შედარებით მარტივი,
- a-1უნდა იყოს მრავალჯერადი გვყველა ძირითადი ფაქტორისთვის გვნომრები ,
- თუ არის 4-ის ჯერადი (და ჩვენს შემთხვევაში ეს იქნება ჯერადი), მაშინ a-1უნდა იყოს 4-ის ჯერადი.
არის კიდევ ერთი დახვეწილობა: შედეგად უნდა იქნას მიღებული მხოლოდ X მდგომარეობის ცვლადის ყველაზე მნიშვნელოვანი ბიტები, რადგან ყველაზე დაბალი ბიტებისთვის შემთხვევითობის სტატისტიკური პარამეტრები გაცილებით უარესია. ხაზოვანი თანმიმდევრული ალგორითმი ჩვეულებრივ დანერგილია როგორც სტანდარტული rand() მრავალ ბიბლიოთეკაში.

დადებითი:

  • მაქსიმალური შესაძლო პერიოდი მდგომარეობის ცვლადის მოცემული ზომისთვის;
  • საკმარისად სწრაფი;
  • ხშირად უკვე დანერგილია შემდგენელი ბიბლიოთეკაში.
მინუსები:
  • საჭიროა გამრავლების ოპერაცია;
  • ყველა ბიტი არ არის თანაბრად შემთხვევითი.
რეზიუმე:სწრაფი და მარტივი ალგორითმი არც თუ ისე მოთხოვნადი აპლიკაციებისთვის.
ფიბონაჩის მეთოდი ჩამორჩენით
ეს ალგორითმი იყენებს კავშირს
X i = X i-a - X i-b,
სად არის სახელმწიფო ცვლადი X- ხელმოუწერელი მთელი რიცხვი. დაგვიანების მნიშვნელობები და მიიღება არა რომელიმე, არამედ მკაცრად განსაზღვრული, მაქსიმალური ხარისხის მისაღწევად, რეკომენდებულია წყვილები (17.5), (55.24) ან (97.33). რაც უფრო დიდია შეფერხება, მით უფრო გრძელია პერიოდი და მით უკეთესია მიმდევრობის სპექტრული თვისებები. მეორე მხრივ, გენერატორის მუშაობისთვის აუცილებელია წინა რიცხვების max(a,b) შენახვა, რაც ყოველთვის არ არის მისაღები. ასევე, გენერატორის გასაშვებად საჭიროა max(a,b) რიცხვები, რომლებიც ჩვეულებრივ მიიღება უფრო მარტივი PRNG-ის გამოყენებით.

დადებითი:

  • არ საჭიროებს გამრავლების ოპერაციებს;
  • შემთხვევითი რიცხვის ყველა ბიტი ექვივალენტურია სტატისტიკური თვისებებით.
მინუსები:
  • მოითხოვს დიდი რაოდენობით მეხსიერებას;
  • გასაშვებად მოითხოვს რიცხვების დიდ მასივს.
რეზიუმე:ძალიან მაღალი ხარისხის, მაგრამ რესურსზე ინტენსიური ალგორითმი.
ხაზოვანი უკუკავშირის Shift რეგისტრაცია


მდგომარეობის ცვლადი ინახება N სიგრძის რეესტრში. შემდეგი მდგომარეობის გენერირება მოიცავს ორ საფეხურს:
  1. ბიტის მნიშვნელობა გამოითვლება C = X i1 xor X i2 xor… X ik, სადაც i1, i2…ik- დარეკეთ ბიტის ნომრების რეგისტრაცია იხრება.
  2. რეგისტრი გადაინაცვლებს 1 ბიტით მარჯვნივ, ყველაზე მარცხენა ბიტი იღებს მნიშვნელობას თან.
გენერატორის გამომავალი არის რეგისტრის ყველაზე მარჯვენა (ან ყველაზე მარცხენა, ან ნებისმიერი) ბიტი, ანუ ფსევდო შემთხვევითი თანმიმდევრობა წარმოიქმნება ერთი ბიტი თითო გამეორებაზე. სწორად შერჩეული ონკანის ნომრებით, გენერატორის პერიოდი იქნება 2 N - 1. „მინუს ერთი“, ვინაიდან რეესტრის აკრძალული ნულოვანი მდგომარეობაა. ფილიალის ნომრები 3-დან 168-მდე შეგიძლიათ იხილოთ ამ დოკუმენტში.
გარდა ზემოთ აღწერილი კონფიგურაციისა, რომელსაც, სხვათა შორის, ფიბონაჩის კონფიგურაციას უწოდებენ (არ აგვერიოს ამავე სახელწოდების PRNG მეთოდში!), არსებობს ე.წ. გალუას კონფიგურაცია.


იმის ნაცვლად, რომ გამოიყენოს ბიტების ჯამი შეხების მიმდევრობაში ახალი ყველაზე მარცხენა ბიტის გენერირებისთვის, ის ახდენს XOR თითოეულ ბიტს შეხების მიმდევრობაში ყველაზე მარჯვენა ბიტით, შემდეგ აბრუნებს მთელ რეესტრს მარჯვნივ. ამ სქემის გაგება უფრო რთულია, მაგრამ უფრო ადვილი შესასრულებელი, რადგან ყველა XOR ოპერაცია შეიძლება ერთდროულად შესრულდეს. ფსევდო შემთხვევითი რიცხვების პერიოდის ხანგრძლივობისა და ხარისხის თვალსაზრისით ფიბონაჩისა და გალუას სქემები ექვივალენტურია.

დადებითი:

  • ძალიან მარტივი განხორციელება, არითმეტიკასაც კი არ საჭიროებს, მხოლოდ ბიტის ოპერაციებს და ცვლებს;
  • ძალიან სწრაფი ალგორითმი (განსაკუთრებით გალუას სქემა);
  • კარგი სტატისტიკური თვისებები.
მინუსები:
  • თქვენ უნდა შეამოწმოთ საწყისი მნიშვნელობა უტოლობისთვის ნულამდე.
რეზიუმე:ძალიან სწრაფი და საკმაოდ მაღალი ხარისხის ალგორითმი.
კრიპტოგამძლე ალგორითმები
კრიპტოგრაფიაში გამოსაყენებლად PRNG-ებს კიდევ ერთი მნიშვნელოვანი მოთხოვნა აქვთ: შეუქცევადობა. ყველა ზემოთ ჩამოთვლილ ალგორითმს არ აქვს ეს თვისება: PRNG-ის რამდენიმე გამომავალი მნიშვნელობის ცოდნით, თქვენ შეგიძლიათ, განტოლებათა მარტივი სისტემის ამოხსნით, იპოვოთ ალგორითმის პარამეტრები (იგივე "ჯადოსნური" მუდმივები ა, ბ, გდა ა.შ). და პარამეტრების ცოდნით, შეგიძლიათ მთელი ფსევდო შემთხვევითი თანმიმდევრობის რეპროდუცირება.
ნებისმიერი საკმარისად ძლიერი ბლოკის შიფრი შეიძლება გამოყენებულ იქნას როგორც კრიპტოგრაფიულად ძლიერი PRNG ალგორითმი. საიდუმლო გასაღების არჩევით, შეგიძლიათ მიიღოთ ფსევდო შემთხვევითი რიცხვების ბლოკები, ალგორითმის გამოყენებით თანმიმდევრულ ნატურალურ რიცხვებზე. N-ბიტიანი ბლოკის შიფრისთვის, პერიოდი იქნება არაუმეტეს 2 ნ. ასეთი სქემის უსაფრთხოება მთლიანად დამოკიდებულია გასაღების საიდუმლოებაზე.
ყველა თანამედროვე კრიპტოგრაფიული ალგორითმი შემოწმებულია PRNG-ად გამოსაყენებლად, ანუ, სერტიფიცირებული ალგორითმის გამოყენებით, არ არის საჭირო განსაკუთრებული ზრუნვა გამომავალი ნაკადის სტატისტიკურ და სპექტრულ თვისებებზე. თქვენ მხოლოდ უნდა ინერვიულოთ კრიპტო ალგორითმების გამოთვლითი „სიხარბეზე“. თუ საჭიროა შესრულება დიდი რაოდენობადაშიფვრის ოპერაციებში, აზრი აქვს აირჩიოს კონტროლერი ტექნიკის კრიპტოგრაფიული ბლოკებით. ხშირად ასეთ კონტროლერებს ასევე აქვთ ძალიან კარგი კრიპტორეზისტენტული აპარატურა PRNG.

ენტროპიის წყაროები

როგორც უკვე აღვნიშნეთ, მხოლოდ დეტერმინისტული ალგორითმების გამოყენებით შეუძლებელია ჭეშმარიტად შემთხვევითი რიცხვის გენერირება. ამიტომ, ჩვეულებრივ გამოიყენება PRNG + გარე კომბინაცია ენტროპიის წყარო. ენტროპიის წყარო გამოიყენება PRNG-ის საწყისი მნიშვნელობის დასაყენებლად, ხოლო ამ უკანასკნელის ამოცანაა უზრუნველყოს მიმდევრობის სპექტრული და სტატისტიკური სიწმინდე. რა შეიძლება გამოვიყენოთ ენტროპიის წყაროდ? დიახ, თითქმის ყველაფერი.
მომხმარებლის აქტივობა
თუ მოწყობილობა რაიმე ფორმით ურთიერთობს მომხმარებელთან, საკმაოდ კარგი გადაწყვეტილებაგამოიყენებს თავად მომხმარებელს ენტროპიის წყაროდ. მაგალითად, ღილაკის დაჭერის დრო, რომელიც იზომება მიკროწამის სიზუსტით (უფრო სწორად, მისი ყველაზე ნაკლებად მნიშვნელოვანი ციფრები), სრულიად არაპროგნოზირებადია. თუმცა, ხშირად მოწყობილობამ უნდა იმუშაოს ავტონომიურად, რაც იმას ნიშნავს, რომ ჩვენ მოკლებული ვართ ინფორმაციის ამ მშვენიერ არხს.
ანალოგური ციფრული გადამყვანი
ბევრ კონტროლერს აქვს ჩაშენებული ADC. და ბევრ კონტროლერში ისინი ძალიან უღიმღამო ხარისხისაა, შექმნილია მხოლოდ "იყოს". ADC შედეგის დაბალი რიგის ბიტები თითქმის ყოველთვის შეიცავს მნიშვნელოვან ხმაურს, გაზომვის დროსაც კი მუდმივი ძაბვა. ეს შეიძლება გამოყენებულ იქნას: შეაერთეთ ADC შეყვანა მიწოდების ძაბვაზე გამყოფის საშუალებით, გააკეთეთ რამდენიმე ათეული გაზომვა, აიღეთ ყველაზე ნაკლებად მნიშვნელოვანი ბიტები - აქ თქვენ გაქვთ დიდი შემთხვევითი რიცხვი. თუ ADC შეიცავს ჩაშენებულ პრეგამაძლიერებელს, ჩართეთ, ისიც ხმაურიანია.
ასინქრონული გენერატორები
თქვენ შეგიძლიათ გამოიყენოთ განსხვავება ორი არასინქრონიზებული საათის გენერატორის პერიოდებში. კონტროლერების უმეტესობა შეიცავს, მაგალითად, დამკვირვებლის ტაიმერს. საიმედოობის გასაზრდელად, იგი იკვრება ცალკე გენერატორიდან, რომელიც არანაირად არ არის დაკავშირებული საათის მთავარ სიგნალთან. საკმარისია დათვალოთ ძირითადი საათის სიგნალის ციკლების რაოდენობა დამკვირვებელი ტაიმერის ერთი პერიოდის განმავლობაში. თუ თქვენ აირჩევთ პერიოდებს ისე, რომ მრიცხველი გაზომვის დროს ბევრჯერ გადაედინება, შეგიძლიათ მიიღოთ საკმაოდ შემთხვევითი რიცხვი. ამ მეთოდის მინუსი არის ის, რომ მას დიდი დრო სჭირდება, რამდენიმე წამამდე.
რეალური დროის საათი
თუ დიაგრამას აქვს რეალური დროის საათი, შეგიძლიათ გამოიყენოთ მათი მიმდინარე წაკითხვები PRNG-ის ინიციალიზაციისთვის. მაგალითად, მიმდინარე თარიღის/დროის Unix დროის ფორმატში გადაყვანით, მაშინვე ვიღებთ 32 ბიტს, რაც არასოდესაღარ განმეორდება, თუ არ წაიკითხავთ წამში ერთხელ. რეალური დროის გამოყენება იძლევა ფასეულობების უნიკალურობას, მაგრამ არ იძლევა არაპროგნოზირებადობას, ამიტომ უმჯობესია გაერთიანდეს ამ მეთოდითსხვებთან ერთად.
RC წრე
თუ კონტროლერს არ აქვს სხვა პერიფერიული მოწყობილობა, გარდა I/O პორტებისა, შეგიძლიათ იმოქმედოთ შემდეგნაირად: ერთ-ერთი ფეხი დაკავშირებულია კონდენსატორის მეშვეობით მიწასთან, ხოლო რეზისტორის მეშვეობით მიწოდების ძაბვასთან. თუ კონტროლერის შეყვანას აქვს შიდა ასაწევი რეზისტორები, გარე რეზისტორი არ არის საჭირო.

ამ პორტში ჩვენ ვაძლევთ "0" სიგნალს - კონდენსატორი გამორთულია. ჩვენ გადავდივართ პორტს შეყვანის რეჟიმში - კონდენსატორი იწყებს დატენვას. როდესაც მასზე ძაბვა მიაღწევს ზღურბლს, შეყვანა გადადის მდგომარეობიდან "0"-ზე "1". დატენვის დრო ძლიერ არის დამოკიდებული ბევრ ფაქტორზე: მიწოდების ძაბვა, RC მიკროსქემის პარამეტრების დრიფტი, ბარიერის არასტაბილურობა, ტემპერატურა, გაჟონვა, ჩარევა. მისი საკმარისი სიზუსტით გაზომვით და ყველაზე ნაკლებად მნიშვნელოვანი ბიტების აღებით, შეგიძლიათ მიიღოთ კარგი შემთხვევითობა.
აპარატურის ხმაურის გენერატორი
მრავალი სერიოზული აპლიკაციისთვის (განსაკუთრებით კრიპტოგრაფია), საჭიროა ენტროპიის უფრო საიმედო წყარო, ვიდრე ზემოთ ჩამოთვლილი. ასეთ შემთხვევებში ისინი იყენებენ ხმაურის გენერატორის სიგნალის ციფრულიზაციას თერმული, გასროლილი ან თუნდაც კვანტური ეფექტების საფუძველზე. ხმაურის ელემენტი, როგორც წესი, არის სპეციალური დიოდი ან ზენერის დიოდი, საიდანაც სიგნალი ძლიერდება და მიეწოდება შედარებას, რომელიც წარმოქმნის ორობითი ბიტის ნაკადს.

იმის უზრუნველსაყოფად, რომ შედარების პასუხის ზღვარი არ იმოქმედებს მიღებული სიგნალის სტატისტიკურ თვისებებზე, გამოიყენება ხმაურის ორი გენერატორი, რომლებიც მუშაობენ ერთ შედარებაზე:

დასკვნა

და ბოლოს, ერთ ისტორიას მოგიყვებით ჩემი ცხოვრებიდან. ეს დაიწყო ფორუმზე დასმული სხვა კითხვით: „როგორ შემიძლია შემთხვევითი რიცხვის გენერირება კონტროლერზე?“ კითხვის ავტორმა განმარტა, რომ როგორც კურსის პროექტი ამზადებს მოწყობილობას, რომელიც ამსგავსებს კამათლის სროლას. ალგორითმების გაგების რამდენიმე წარუმატებელი მცდელობის შემდეგ, თემის სტარტერმა გააზიარა თავისი გამოსავალი: მან უბრალოდ 1000-ჯერ გააგორა რეალური კვარცხლბეკი და შეავსო კონტროლერის მთელი თავისუფალი მეხსიერება მიღებული ნომრებით. გენერატორმა ბრწყინვალედ გაიარა ყველა "შემთხვევითი" ტესტი, იმის გათვალისწინებით, რომ დემონსტრაციის დროს მან გამოიყენა თავისი "რეზერვის" მესამედზე ნაკლები.
მაშასადამე, ასეთ გადაწყვეტას ასევე აქვს სიცოცხლის უფლება, განსაკუთრებით იმ შემთხვევაში, თუ ძალიან მკაცრი მოთხოვნებია დაწესებული რიცხვების შემთხვევითობაზე, მაგრამ ისინი არ არის ძალიან ხშირად საჭირო. მეხსიერების ფასების მკვეთრი ვარდნის პირობებში, შეიძლება გონივრული იყოს მოწყობილობის აღჭურვა „ქაოსის რეზერვით“, რომელიც გაგრძელდება მოწყობილობის მთელი სიცოცხლის განმავლობაში.
გმადლობთ ყურადღებისთვის!

UPD1:როგორც სამართლიანად აღინიშნა კომენტარებში, თუ მოსალოდნელია შეტევა RNG-ზე და თავდამსხმელს აქვს აპარატურის წვდომა მოწყობილობაზე, ენტროპიის გარე წყაროები დიდი სიფრთხილით უნდა იქნას გამოყენებული, რადგან სიგნალის შეცვლა არც ისე რთულია. გარე წყარო. უნდა იქნას გამოყენებული შიდა წყაროები, გარდა გარე.
ასევე კარგი იდეაა მთელი თავისუფალი დროის განმავლობაში ენტროპიის დაგროვება და მისი გამოყენება, როცა შემდეგი შემთხვევითი რიცხვის გენერირება გჭირდებათ. როგორც წესი, ასეთ შემთხვევებში ე.წ ენტროპიის აუზი- მასივი, რომელზედაც პერიოდულად სრულდება PRNG-ის ერთ-ერთი ფუნქცია და რომელშიც მუდმივად არის შერეული მონაცემები ენტროპიის წყაროებიდან.

UPD2:ხშირ შემთხვევაში, სასარგებლოა Entropy pool-ის შიგთავსის შენახვა (ბოდიში, მე არ ვიცი ნორმალური რუსული თარგმანი) EEPROM-ში, რათა მოწყობილობის გამორთვისა და ჩართვის შემდეგ ის აღარ დაგროვდეს. ეს, პირველ რიგში, ეხება ენტროპიის მიღებას ასინქრონული გენერატორების მეთოდით: საკმარისად სტაბილურ პირობებში, ერთი და იგივე თანმიმდევრობა შეიძლება წარმოიქმნას ყოველი ჩართვის შემდეგ.
თუ მოსალოდნელია თავდასხმა, მიიღეთ სიფრთხილის ზომები EEPROM-ის გაყალბების წინააღმდეგ. თუ კონტროლერი ამის საშუალებას იძლევა, დაბლოკეთ კითხვა/წაშლა/ჩაწერა დაბლოკვის ბიტების გამოყენებით და მისი ჩართვისას დააკვირდით EEPROM-ის მთლიანობას, სულ მცირე, მარტივი საკონტროლო ჯამების გამოყენებით.

ტეგები:

  • RNG
  • gpsch
  • მიკროკონტროლერები
  • ალგორითმები
ტეგების დამატება