Generació de Nombres Pseudoaleatoris: LCG + Arduino

1. Algorisme LCG (Linear Congruential Generator)

L’algorisme congruencial lineal genera seqüències pseudoaleatòries segons la fórmula de recursió:

\[ X_{n+1} \;=\; \bigl(a \cdot X_n + c\bigr)\;\bmod\; m \]

On:

Exemple Numèric Pas a Pas

Suposem:

  1. \(X_1 = (5 \times 7 + 3) \bmod 16 = 38 \bmod 16 = 6\)
  2. \(X_2 = (5 \times 6 + 3) \bmod 16 = 33 \bmod 16 = 1\)
  3. \(X_3 = (5 \times 1 + 3) \bmod 16 = 8 \bmod 16 = 8\)
  4. \(X_4 = (5 \times 8 + 3) \bmod 16 = 43 \bmod 16 = 11\)
  5. \(X_5 = (5 \times 11 + 3) \bmod 16 = 58 \bmod 16 = 10\)

Seqüència completa: 7, 6, 1, 8, 11, 10

2. Arduino: random(), randomSeed() i LCG

Arduino implementa un LCG similar al de C. La funció random() crida internament un LCG, i randomSeed() estableix X₀.

Pas 1: Sense llavor (seed) — seqüència fixa

void setup() {
  Serial.begin(9600);
  // No cridem randomSeed(): X₀ per defecte → seqüència sempre igual
  for (int i = 0; i < 5; i++) {
    Serial.println(random(0, 100));
  }
}
void loop() {}

Pas 2: Llavor aleatòria amb soroll analògic

void setup() {
  Serial.begin(9600);
  // Utilitza la lectura analògica per generar soroll: X₀ diferent cada reinici
  randomSeed(analogRead(A0));
  for (int i = 0; i < 5; i++) {
    Serial.println(random(0, 100));
  }
}
void loop() {}

Pas 3: Llavor fixa per reproduir seqüències

void setup() {
  Serial.begin(9600);
  // Llavor fixa = seqüència sempre reproduïble
  randomSeed(1234);
  for (int i = 0; i < 5; i++) {
    Serial.println(random(0, 100));
  }
}
void loop() {}

3. Observacions Finals