Strādājot ar Arduino projektiem, bieži rodas nepieciešamība ģenerēt nejaušus skaitļus. Varbūt jūs veidojat spēli, interaktīvu ierīci vai vienkārši jums ir nepieciešami notikumi, kas neatbilst paredzamam modelim. Bet vai Arduino ģenerētie skaitļi tiešām ir pilnīgi nejauši? Īsā atbilde ir nē, un tāpēc rodas vajadzība izprast skaitļu jēdzienu pseidogadījuma un kā tos efektīvi īstenot.
Šajā rakstā mēs jums iemācīsim, kā Arduino ģenerēt nejaušus skaitļus, kā izmantot funkcijas izlases y izlases sēklas, un kāpēc tie ir svarīgi, lai nodrošinātu, ka mūsu skaitļu secības ir pēc iespējas nejaušākas. Jūs to redzēsit, lai gan ģenerētie skaitļi tā nav pilnīgi nejauši, mēs varam sasniegt daudz augstāku nejaušības pakāpi, pareizi manipulējot ar sēklām, ko izmanto Arduino.
Kā Arduino ģenerē nejaušus skaitļus?
Principā tāds mikrokontrolleris kā Arduino nespēj ģenerēt patiesus nejaušus skaitļus, jo tā ir ierīce, kas izstrādāta tā, lai tā būtu paredzama un precīza. Arduino veic matemātiskos aprēķinus ar sēklu (bāzes skaitli), lai ģenerētu skaitļu virkni. pseidogadījuma. Tas nozīmē, ka no vienas un tās pašas sēklas jūs vienmēr iegūsit to pašu skaitļu secību.
Lai skaitļi neatkārtotos daudzas reizes, varat mainīt sēklu ar funkciju randomSeed(). Tas ļauj mainīt sākuma punktu, lai ģenerētu skaitļu secību. Izmantojot šo rīku kopā ar dažiem gudriem paņēmieniem neparedzamu sēklu iegūšanai, piemēram, nesaistītas analogās tapas nolasīšanu vai programmas izpildes laika mērīšanu, mēs varam panākt, ka skaitļi mainās ar katru koda izpildi.
Izmantojot izlases funkciju
Arduino piedāvā divus pamata veidus, kā izsaukt šo funkciju izlases: viens, lai ģenerētu nejaušu skaitli no 0 līdz maksimālajam skaitlim (maksimālais — 1), un otrs, lai ģenerētu nejaušu skaitli starp minimālo vērtību un maksimālo vērtību (min un max).
Pamata sintakse ir šāda:
- nejauši (maks.); ģenerē skaitli no 0 līdz max - 1.
- nejauši (min, max); ģenerē skaitli starp min y max - 1.
Piemēram, ja mēs piezvanām nejauši (250), mēs iegūsim skaitli no 0 līdz 249. Tāpat, ja izpildīsim nejauši (100,200), mēs iegūsim nejaušu skaitli no 100 līdz 199.
Izlases sēklu funkcijas nozīme
Kā jau minējām, lai neļautu Arduino vienmēr ģenerēt vienu un to pašu skaitļu secību katrā programmas izpildē, mums ir jāpārliecinās, ka ir jāmaina sēkla, ko mēs izmantojam randomSeed(). Viltība ir izvēlēties neparedzamu sēklu katru reizi, kad kods tiek izpildīts.
Viens no visizplatītākajiem veidiem, kā ģenerēt nejaušu sēklu, ir nolasīt nesaistītu analogo tapu. Šajā gadījumā šī tapa darbojas neprognozējami, uztverot elektrisko troksni, kas garantē, ka nolasītā vērtība pastāvīgi mainīsies. Sēklu var izveidot šādi:
randomSeed(analogRead(0));
Kā alternatīvu mēs varam izmantot funkciju milis () lai uzzinātu laiku, kas pagājis kopš programmas palaišanas, un izmantotu to kā sēklu. Tas ir īpaši noderīgi interaktīvos projektos, kur lietotājs var nospiest pogu dažādos laika punktos, kas ģenerēs atšķirīgu sākumu katrai ciparu secībai.
Piemēram, mēs varam izmantot randomSeed(millis()); lai sēklas mainītos atkarībā no izpildes laika.
Praktisks piemērs: Elektroniskie kauliņi
Klasisks nejaušu skaitļu izmantošanas pielietojums Arduino ir elektronisko kauliņu izveide. Šajā gadījumā katru reizi, kad nospiežam pogu, tiek ģenerēts skaitlis no 1 līdz 6, un iedegas gaismas diodes, kas attēlo attiecīgās formas priekšpusi.
Šis ir piemērs tam, kā kodu varētu strukturēt:
spiedpoga = 8; // Pogas tapa
nejaušs skaits = nejaušs(1, 7); // Izveidojiet nejaušu skaitli no 1 līdz 6
Nospiežot pogu, Arduino ģenerē izlases numuru un automātiski aktivizē atbilstošās gaismas diodes uz 1,5 sekundēm, lai lietotājs varētu apskatīt gala rezultātu. Pēc neilga laika gaismas diodes izslēdzas, līdz tiek vēlreiz nospiesta poga.
Ģenerējiet uzlabotus pseidogadījuma skaitļus
Lai vēl vairāk uzlabotu nejaušību, daži lietotāji izvēlas koncentrēties uz dažiem pirmajiem nejaušā trokšņa bitiem, ko analogā tapa var uztvert. Tas ir tāpēc, ka pirmie biti satur lielāku mainīgumu, ko var izmantot projektos, kuriem nepieciešama lielāka nejaušība. Interesants veids, kā to izdarīt, būtu izmantot bitu darbību:
randomSeed(analogRead(A0) & 3);
Šī metode ļauj iegūt pirmos trokšņa bitus, ko uztver analogā tapa A0, kas uzlabo ģenerēto skaitļu nejaušību. Arduino ir iespēja ģenerēt līdz pat 4.294.967.295 XNUMX XNUMX XNUMX dažādiem pseidogadījuma skaitļiem, kas ir vairāk nekā pietiekami lielākajai daļai mājas projektu.
Visbeidzot, kad esat pareizi iestatījis sēklu un diapazonu, varat izbaudīt lielāku Arduino ģenerēto skaitļu mainīgumu, kas ir ideāli piemērots dažādiem projektiem, piemēram, spēlēm, interaktīvām sistēmām un simulācijām. Piemēram:
void setup() {
Serial.begin(9600); // Inicializamos la comunicación serial
randomSeed(analogRead(0)); // Semilla para generar números más aleatorios
}
void loop() {
int numeroAleatorio = random(1, 11); // Genera un número aleatorio entre 1 y 10
Serial.println(numeroAleatorio);
delay(1000); // Esperamos 1 segundo
}
Neaizmirstiet, ka, lai gan Arduino nespēj ģenerēt patiesi nejaušus skaitļus, tādu paņēmienu izmantošana kā šeit minētie ievērojami uzlabos rezultātus un ļaus simulēt nejaušību vairumā gadījumu.