Quan treballes amb projectes a Arduino, és comú trobar-se amb la necessitat de generar números aleatoris. Potser estàs construint un joc, un dispositiu interactiu o simplement necessites esdeveniments que no segueixin un patró predictible. Però, realment els números que genera un Arduino són completament aleatoris? La resposta curta és no, i per això sorgeix la necessitat de comprendre el concepte de números pseudoaleatoris i com implementar-los eficaçment.
En aquest article, t'ensenyarem com generar números aleatoris a Arduino, com utilitzar les funcions atzar y randomSeed, i per què aquestes són claus per assegurar-nos que les nostres seqüències de números siguin tan aleatòries com sigui possible. Veuràs que, encara que els números generats no són completament aleatoris, podem aconseguir un grau molt més alt d'aleatorietat manipulant adequadament les llavors (seed) que empra Arduino.
Com genera Arduino números aleatoris?
En principi, un microcontrolador com Arduino no és capaç de generar nombres aleatoris veritables, ja que és un dispositiu dissenyat per ser predictible i precís. El que fa Arduino és executar càlculs matemàtics amb una llavor (un número base) per generar una seqüència de números pseudoaleatoris. Això vol dir que, a partir d'una mateixa llavor, sempre obtindràs la mateixa seqüència de números.
Per evitar que els números es repeteixin moltes vegades, es pot variar la llavor amb la funció randomSeed(). Això permet canviar el punt d'inici per generar la seqüència de números. Usant aquesta eina juntament amb algunes tècniques enginyoses per obtenir llavors impredictibles, com llegir un pin analògic no connectat o mesurar el temps d'execució del programa, podem aconseguir que els números variïn en cada execució del codi.
Ús de la funció random
Arduino ens proporciona dues maneres bàsiques d'invocar la funció atzar: una per generar un nombre aleatori entre 0 i un nombre màxim (max – 1), i una altra per generar un nombre aleatori entre un valor mínim i un valor màxim (min i max).
La sintaxi bàsica és la següent:
- random(max); genera un nombre entre 0 i màx – 1.
- random(min, max); genera un número entre min y màx – 1.
Per exemple, si truquem a random(250), obtindrem un nombre entre 0 i 249. De la mateixa manera, si executem random(100,200), obtindrem un nombre aleatori entre 100 i 199.
Importància de la funció randomSeed
Com ja hem esmentat, per evitar que Arduino generi sempre la mateixa seqüència de números en cada execució del programa, hem d'assegurar-nos de variar la llavor que utilitzem a randomSeed(). El truc és triar una llavor impredictible cada vegada que s'executi el codi.
Una de les formes més comunes de generar una llavor aleatòria és llegir un pin analògic no connectat. En aquest cas, aquest pin es comporta de manera impredictible, captant soroll elèctric, cosa que garanteix que el valor llegit variarà constantment. La llavor es pot establir de la manera següent:
randomSeed(analogRead(0));
Alternativament, podem fer servir la funció Millis () per obtenir el temps transcorregut des que es va iniciar el programa i utilitzar-lo com a llavor. Això és especialment útil en projectes interactius on l'usuari pot pressionar un botó en diferents moments del temps, cosa que generarà un inici diferent per a cada seqüència de números.
Per exemple, podem fer servir randomSeed(millis()); perquè la llavor variï segons el temps d'execució.
Exemple pràctic: Donat electrònic

Una aplicació clàssica de lús de números aleatoris a Arduino és la creació dun dau electrònic. En aquest cas, cada vegada que pressionem un botó, es genera un número entre 1 i 6, i s'encenen leds per representar la cara del dau corresponent.
Aquest és un exemple de com es podria estructurar el codi:
polsador = 8; // Pin del botó
numAleatori = random(1, 7); // Genera un nombre aleatori entre 1 i 6
En prémer el polsador, Arduino genera el nombre aleatori i automàticament activa els leds corresponents durant 1,5 segons perquè l'usuari pugui visualitzar el resultat final. Després d'un temps curt, els leds s'apaguen fins que el botó es torna a pressionar.
Generar números pseudoaleatoris millorats
Per millorar encara més l'aleatorietat, alguns usuaris s'estimen més centrar-se en els primers bits de soroll aleatori que pot captar el pin analògic. Això és perquè els primers bits contenen una major quantitat de variabilitat, la qual cosa es pot aprofitar en projectes que requereixin una aleatorietat més gran. Una manera interessant de fer-ho seria fer servir l'operació bit a bit:
randomSeed(analogRead(A0) & 3);
Aquest mètode permet extreure els primers bits del soroll captat pel pin analògic A0, cosa que millora l'aleatorietat dels números generats. Arduino té la capacitat de generar fins a 4.294.967.295 números pseudoaleatoris diferents, la qual cosa és més que suficient per a la majoria dels projectes casolans.
Finalment, una vegada que estableixis adequadament la llavor i el rang, podràs gaudir d'una major variabilitat en els números generats per Arduino, cosa que és ideal per a una gran varietat de projectes com ara jocs, sistemes interactius i simulacions. Per exemple:
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
}
No oblidis que, encara que Arduino no és capaç de generar números veritablement aleatoris, aplicar tècniques com les esmentades aquí millorarà significativament els resultats i et permetrà simular aleatorietat en la majoria dels casos.