Generování náhodných čísel pomocí Arduina: techniky a příklady

  • Arduino generuje pseudonáhodná čísla, ne skutečně náhodná.
  • Použití randomSeed a variabilního semena je klíčem k tomu, abyste se vyhnuli opakujícím se sekvencím.
  • Funkce millis() a analogRead() mohou simulovat náhodnost změnou semene.

arduino náhodná čísla

Při práci s projekty Arduino se běžně setkáváme s nutností generovat náhodná čísla. Možná vytváříte hru, interaktivní zařízení nebo prostě potřebujete události, které se neřídí předvídatelným vzorem. Jsou ale čísla generovaná Arduinem opravdu zcela náhodná? Krátká odpověď je ne, a proto vyvstává potřeba porozumět pojmu čísla pseudonáhodný a jak je efektivně implementovat.

V tomto článku vás naučíme, jak generovat náhodná čísla v Arduinu, jak používat funkce náhodný y náhodnéSeeda proč jsou klíčem k zajištění toho, aby naše číselné řady byly co nejnáhodnější. Uvidíte to, i když vygenerovaná čísla nejsou zcela náhodně, můžeme dosáhnout mnohem vyšší míry náhodnosti správnou manipulací se semeny, které Arduino používá.

Jak Arduino generuje náhodná čísla?

Mikrokontrolér jako Arduino v zásadě není schopen generovat skutečná náhodná čísla, protože je to zařízení navržené tak, aby bylo předvídatelné a přesné. To, co Arduino dělá, je provádění matematických výpočtů se semenem (základním číslem) pro generování posloupnosti čísel pseudonáhodný. To znamená, že ze stejného semínka získáte vždy stejnou posloupnost čísel.

Chcete-li zabránit tomu, aby se čísla mnohokrát opakovala, můžete pomocí funkce měnit seed randomSeed(). To vám umožní změnit počáteční bod pro generování posloupnosti čísel. Pomocí tohoto nástroje spolu s některými chytrými technikami pro získání nepředvídatelných zárodků, jako je čtení nepřipojeného analogového pinu nebo měření doby provádění programu, můžeme dosáhnout toho, aby se čísla měnila s každým spuštěním kódu.

Použití náhodné funkce

Arduino nám poskytuje dva základní způsoby, jak funkci vyvolat náhodný: jeden pro generování náhodného čísla mezi 0 a maximálním číslem (max – 1) a druhý pro generování náhodného čísla mezi minimální hodnotou a maximální hodnotou (min a max).

Základní syntaxe je následující:

  • náhodný (max.); vygeneruje číslo mezi 0 a max – 1.
  • náhodný (min, max); generuje číslo mezi min y max – 1.

Například když zavoláme náhodný (250), získáme číslo mezi 0 a 249. Stejně tak, když provedeme náhodný (100,200), dostaneme náhodné číslo mezi 100 a 199.

Význam funkce randomSeed

Jak jsme již zmínili, abychom zabránili Arduinu, aby vždy generovalo stejnou sekvenci čísel při každém spuštění programu, musíme se ujistit, že měníme seed, který používáme. randomSeed(). Trik spočívá ve výběru nepředvídatelného semene při každém spuštění kódu.

Jedním z nejběžnějších způsobů generování náhodného semene je čtení nepřipojeného analogového pinu. V tomto případě se tento kolík chová nepředvídatelně a zachycuje elektrický šum, což zaručuje, že načtená hodnota se bude neustále měnit. Osivo lze založit takto:

randomSeed(analogRead(0));

Případně můžeme použít funkci millis () získat čas uplynulý od spuštění programu a použít jej jako semeno. To je užitečné zejména v interaktivních projektech, kde uživatel může stisknout tlačítko v různých okamžicích, což vygeneruje jiný začátek pro každou sekvenci čísel.

Můžeme použít např randomSeed(millis()); takže semeno se mění v závislosti na době provedení.

Praktický příklad: Elektronické hrací kostky

Arduino IDE, datové typy, programování

Klasickou aplikací použití náhodných čísel v Arduinu je vytvoření elektronické kostky. V tomto případě se pokaždé, když stiskneme tlačítko, vygeneruje číslo mezi 1 a 6 a rozsvítí se LED diody, které představují líc příslušné kostky.

Toto je příklad toho, jak by mohl být kód strukturován:

tlačítko = 8; // Špendlík tlačítka
randomNum = random(1, 7); // Vygeneruje náhodné číslo mezi 1 a 6

Když stisknete tlačítko, Arduino vygeneruje náhodné číslo a automaticky aktivuje odpovídající LED na 1,5 sekundy, aby si uživatel mohl prohlédnout konečný výsledek. Po krátké době LED zhasnou, dokud znovu nestisknete tlačítko.

Generujte vylepšená pseudonáhodná čísla

Pro další zlepšení náhodnosti se někteří uživatelé raději soustředí na prvních pár bitů náhodného šumu, které může analogový pin zachytit. První bity totiž obsahují větší množství variability, kterou lze využít v projektech vyžadujících větší náhodnost. Zajímavým způsobem, jak toho dosáhnout, by bylo použití bitové operace:

randomSeed(analogRead(A0) & 3);

Tato metoda umožňuje extrahovat první bity šumu zachycené analogovým pinem A0, což zlepšuje náhodnost generovaných čísel. Arduino má schopnost generovat až 4.294.967.295 XNUMX XNUMX XNUMX různých pseudonáhodných čísel, což je více než dost pro většinu domácích projektů.

Konečně, jakmile správně nastavíte seed a rozsah, můžete si užít větší variabilitu čísel generovaných Arduinem, což je ideální pro širokou škálu projektů, jako jsou hry, interaktivní systémy a simulace. Například:

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
}

Nezapomeňte, že ačkoli Arduino není schopno generovat skutečně náhodná čísla, použití technik, jako jsou ty zde uvedené, výrazně zlepší výsledky a umožní vám ve většině případů simulovat náhodnost.