Dirbant su Arduino projektais įprasta susidurti su būtinybe generuoti atsitiktinius skaičius. Galbūt kuriate žaidimą, interaktyvų įrenginį arba tiesiog jums reikia įvykių, kurie neatitinka nuspėjamo modelio. Bet ar „Arduino“ generuojami skaičiai tikrai visiškai atsitiktiniai? Trumpas atsakymas yra ne, todėl kyla poreikis suprasti skaičių sąvoką pseudoatsitiktinis ir kaip juos efektyviai įgyvendinti.
Šiame straipsnyje mes išmokysime, kaip generuoti atsitiktinius skaičius Arduino, kaip naudotis funkcijomis atsitiktinis y atsitiktinė sėkla, ir kodėl tai yra svarbiausia norint užtikrinti, kad mūsų skaičių sekos būtų kiek įmanoma atsitiktinesnės. Tai pamatysite, nors sugeneruoti skaičiai nėra tokie visiškai atsitiktinai, galime pasiekti daug didesnį atsitiktinumo laipsnį tinkamai manipuliuodami sėklomis, kurias naudoja Arduino.
Kaip Arduino generuoja atsitiktinius skaičius?
Iš esmės toks mikrovaldiklis kaip „Arduino“ nesugeba generuoti tikrų atsitiktinių skaičių, nes tai įrenginys, sukurtas taip, kad būtų nuspėjamas ir tikslus. Arduino atlieka matematinius skaičiavimus su sėkla (baziniu skaičiumi), kad sukurtų skaičių seką. pseudoatsitiktinis. Tai reiškia, kad iš tos pačios sėklos visada gausite tą pačią skaičių seką.
Kad skaičiai nesikartotų daug kartų, galite keisti sėklą naudodami funkciją atsitiktinė sėkla (). Tai leidžia pakeisti pradžios tašką, kad būtų sukurta skaičių seka. Naudodami šį įrankį kartu su kai kuriais sumaniais būdais, kaip gauti nenuspėjamų pradinių elementų, pvz., nuskaitydami neprijungtą analoginį kaištį arba išmatuodami programos vykdymo laiką, galime pasiekti, kad skaičiai keistųsi kiekvieną kartą paleidus kodą.
Atsitiktinės funkcijos naudojimas
Arduino suteikia mums du pagrindinius būdus, kaip iškviesti funkciją atsitiktinis: vienas generuoja atsitiktinį skaičių nuo 0 iki didžiausio skaičiaus (maks. – 1), o kitas – atsitiktiniam skaičiui tarp minimalios ir didžiausios vertės (min. ir maks.).
Pagrindinė sintaksė yra tokia:
- atsitiktinis (maks.); generuoja skaičių tarp 0 ir maksimalus – 1.
- atsitiktinis (min., maks.); generuoja skaičių tarp minutės y maksimalus – 1.
Pavyzdžiui, jei paskambinsime atsitiktinis (250), gausime skaičių nuo 0 iki 249. Panašiai, jei vykdysime atsitiktinis (100,200), gausime atsitiktinį skaičių nuo 100 iki 199.
Atsitiktinės sėklos funkcijos svarba
Kaip jau minėjome, norėdami, kad „Arduino“ negeneruotų tos pačios skaičių sekos kiekvienoje programos vykdymo metu, būtinai pakeisime naudojamą sėklą. atsitiktinė sėkla (). Triukas yra pasirinkti nenuspėjamą sėklą kiekvieną kartą, kai vykdomas kodas.
Vienas iš labiausiai paplitusių būdų, kaip generuoti atsitiktinę sėklą, yra nuskaityti neprijungtą analoginį kaištį. Tokiu atveju tas kaištis elgiasi nenuspėjamai, paimdamas elektrinį triukšmą, o tai garantuoja, kad nuskaityta vertė nuolat keisis. Sėklą galima nustatyti taip:
randomSeed(analogRead(0));
Arba galime naudoti funkciją milis () Norėdami sužinoti, kiek laiko praėjo nuo programos paleidimo, ir panaudoti ją kaip pradžią. Tai ypač naudinga interaktyviuose projektuose, kur vartotojas gali paspausti mygtuką skirtingu metu, o tai sugeneruos skirtingą kiekvienos skaičių sekos pradžią.
Pavyzdžiui, galime naudoti atsitiktinisSeed(millis()); kad sėkla skirtųsi priklausomai nuo vykdymo laiko.
Praktinis pavyzdys: Elektroniniai kauliukai
Klasikinė atsitiktinių skaičių naudojimo programa „Arduino“ yra elektroninio kauliuko kūrimas. Tokiu atveju kiekvieną kartą paspaudus mygtuką, sugeneruojamas skaičius nuo 1 iki 6, o šviesos diodai užsidega, kad pavaizduotų atitinkamo kabliuko veidą.
Tai pavyzdys, kaip kodas gali būti struktūrizuotas:
mygtukas = 8; // Mygtuko kaištis
atsitiktinisSkaičius = atsitiktinis(1, 7); // Sugeneruokite atsitiktinį skaičių nuo 1 iki 6
Kai paspausite mygtuką, Arduino sugeneruoja atsitiktinį skaičių ir 1,5 sekundės automatiškai įjungia atitinkamus šviesos diodus, kad vartotojas galėtų peržiūrėti galutinį rezultatą. Po trumpo laiko šviesos diodai išsijungia, kol mygtukas dar kartą paspaudžiamas.
Generuokite patobulintus pseudoatsitiktinius skaičius
Siekdami dar labiau pagerinti atsitiktinumą, kai kurie vartotojai nori sutelkti dėmesį į pirmuosius kelis atsitiktinio triukšmo bitus, kuriuos gali pagauti analoginis kaištis. Taip yra todėl, kad pirmieji bitai turi didesnį kintamumą, kuris gali būti naudojamas projektuose, kuriems reikalingas didesnis atsitiktinumas. Įdomus būdas tai padaryti būtų naudoti bitų operaciją:
randomSeed(analogRead(A0) & 3);
Šis metodas leidžia išgauti pirmuosius analoginio kaiščio A0 užfiksuoto triukšmo bitus, o tai pagerina generuojamų skaičių atsitiktinumą. „Arduino“ turi galimybę sugeneruoti iki 4.294.967.295 XNUMX XNUMX XNUMX skirtingų pseudoatsitiktinių skaičių, o tai yra daugiau nei pakankamai daugeliui namų projektų.
Galiausiai, tinkamai nustatę sėklą ir diapazoną, galėsite mėgautis didesniu „Arduino“ generuojamų skaičių kintamumu, kuris idealiai tinka įvairiems projektams, tokiems kaip žaidimai, interaktyvios sistemos ir modeliavimas. Pavyzdžiui:
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
}
Nepamirškite, kad nors „Arduino“ nesugeba generuoti tikrai atsitiktinių skaičių, taikant tokius metodus, kaip čia paminėta, rezultatai žymiai pagerės ir daugeliu atvejų galėsite imituoti atsitiktinumą.