Zwei Random Zahlen die sich einzeln von der vorherigen unterscheiden müssen, auch untereinander

Moin Jungs…
Ich habe gerade ein Problem. Ich habe schon etwas länger rumprobiert. Folgendes Szenario:

Ich benötige zwei Random Zahlen (1-5), die sich von der jeweils vorherigen unterscheiden müssen. Das ist soweit kein Problem. Jedoch muss sich die jeweils andere Randomzahl ebenfalls von den den beiden vorhergehenden unterscheiden.

Szenario zum Verständnis:

Sporttraining… 5 Stück Funk LED Ampeln. Diese sollen jeweils random angesteuert werden. Es sollen jeweils eine oder zwei Ampeln in jeder neuen Sequenz nach Zufall leuchten, aber niemals die Gleichen. Damit die Jungs halt hin und her sprinten und nicht vor der gleichen Ampel bei ner neuen Sequenz stehen bleiben. Wenn zwei leuchten können die sich aussuchen, wo die hinlaufen.

Hat da eventuell jemand einen Ansatz? Einzeln random mit Ausschluss der letzten kein Ding. Aber mit zwei unabhängig voneinander bereitet mir das Kopfzerbrechen. Ich bekomme das einfach nicht hin.

Über Hilfe von Euch würde ich mich sehr freuen.

Schon mal vielen Dank im Voraus…

Gruß

mastermixer1973

Dann hier mein Ansatz:

// Sketch für Random 2 aus 5
// 1 != {1,2}
// 2 != {1,2}
const int minZahl = 1;
const int maxZahl = 6;
int zahl[2] = {0}; // nimmt Werte auf
int lastZahl[2] = {0}; // Merker
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  randomSeed(micros());
}
void loop()
{
  zahl[0] == random(minZahl, maxZahl);
  // Variante 1:
  while (zahl[0] == lastZahl[0])
    // Variante 2:
    // while (zahl[0] == lastZahl[0] || zahl[0] == lastZahl[1])
  {
    zahl[0] = random(minZahl, maxZahl);
  }
  lastZahl[0] = zahl[0];
  zahl[1] == random(minZahl, maxZahl);
  while (zahl[1] == lastZahl[0] || zahl[1] == lastZahl[1])
  {
    zahl[1] = random(minZahl, maxZahl);
  }
  lastZahl[1] = zahl[1];
  Serial.print(F("ZAHL 1: "));
  Serial.print(zahl[0]);
  Serial.print(F(" ZAHL 2: "));
  Serial.println(zahl[1]);
}

Es gibt zwei Varianten.
V1 ist aktiv.
Wenn Du V2 willst, dann Zeile 18 auskommentieren und Zeile 20 einkommentieren.

1 Like

Moin…
Tja, so hab ich das auch schon versucht (V1 und V2 ausprobiert). Sekunde, ich hänge mal ne Zahlenfolge an:

ZAHL 1: 2 ZAHL 2: 1
ZAHL 1: 4 ZAHL 2: 2 ← hier ist die Zahl 2 gleich der Zahl 1 aus dem vorhergehenden Schritt
ZAHL 1: 3 ZAHL 2: 4 ← hier ist die Zahl 2 gleich der Zahl 1 aus dem vorhergehenden Schritt
ZAHL 1: 1 ZAHL 2: 3 ← hier ist die Zahl 2 gleich der Zahl 1 aus dem vorhergehenden Schritt
ZAHL 1: 2 ZAHL 2: 4

Und das ist ja genau das Problem. Weil dann die LED Ampel 4 wieder leuchtet. Soll sie ja aber nicht.
Sonst noch jemand ne Idee?

Vielen Dank schon mal im Voraus,

mastermixer1973

Solche Versuche wären nett vorher zu wissen.
Dann hätte ich den Code nicht als Ansatz geschrieben.
Nu hier:

// Sketch für Random 2 aus 5
// 1 != {1,2}
// 2 != {1,2}
const int minZahl = 1;
const int maxZahl = 6;
int zahl[2] = {0}; // nimmt Werte auf
int lastZahl[2] = {0}; // Merker
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  randomSeed(micros());
}
void loop()
{
  zahl[0] == random(minZahl, maxZahl);
  while ((zahl[0] == lastZahl[0]) || (zahl[0] == lastZahl[1]))
  {
    zahl[0] = random(minZahl, maxZahl);
  }
  zahl[1] == random(minZahl, maxZahl);
  while ((zahl[1] == zahl[0]) || (zahl[1] == lastZahl[0]) || (zahl[1] == lastZahl[1]))
  {
    zahl[1] = random(minZahl, maxZahl);
  }

  lastZahl[0] = zahl[0];
  lastZahl[1] = zahl[1];
  delay(100);
  Serial.print(F("ZAHL 1: "));
  Serial.print(zahl[0]);
  Serial.print(F(" ZAHL 2: "));
  Serial.println(zahl[1]);
}

Hi my_xy_projekt
Ja, geil, so geht’s. :grinning:
Ich hatte auch mit den “OR” Bedingungen rumprobiert, bin im Endeffekt auf Deinen ersten Lösungsansatz gekommen, der aber ja leider nicht funktioniert hat.
Mir fehlt halt hier und da noch ein bisschen das logische Denken.
Deshalb noch mal vielen Dank für Deine Unterstützung…

Gruß

mastermixer1973

So wärs gestern Abend auch schon gegangen…
Das mit der Logik ist nicht so problematisch, das kommt mit nem Stift und nem zettel.
Aber wer Dir helfen will/kann, sollte wissen wo Dein Stand der Dinge ist. Das ist viel wichtiger. Denke dran: Niemand kann auf Deinen Monitor sehen.
Na dann…

Die Micros könnten evtl. zu gleichmäßig für den Seed sein. Nimm einen unbenutzten analogen Port.

void seedRandom32(uint8_t analogPort) {
uint32_t wert = analogRead(analogPort) & 0x1;
  for(uint8_t i = 0; i < 32; i++) {
    wert = wert << 1;
    wert |= analogRead(analogPort) & 0x1;     
  }
  randomSeed(wert);
}

Gruß Tommy

Komplett würde es bei mir so aussehen (wenn die Funktion fertig ist stehen in alt die beiden Zufallszahlen)

byte alt[2] {0,0};
const byte min = 1;  // incl.
const byte max = 6;  // excl.

void zweiZ() {
  byte z1,z2;
  z1 = random(min,max);
  while (z1 == alt[0] || z1 == alt[1]) z1 = random(min,max);
  z2 = random(min,max); 
  while (z2 == alt[0] || z2 == alt[1] || z2 == z1) z2 = random(min,max);
  Serial.print("z1 / z2 : ");
  Serial.print(z1);
  Serial.print(" / ");
  Serial.println(z2);
  alt[0] = z1;
  alt[1] = z2;
}

void seedRandom32(uint8_t analogPort) {
uint32_t wert = analogRead(analogPort) & 0x1;
  for(uint8_t i = 0; i < 32; i++) {
    wert = wert << 1;
    wert |= analogRead(analogPort) & 0x1;     
  }
  randomSeed(wert);
}
void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  seedRandom32(A0);
  for(byte i = 0;i<100;i++) zweiZ();
}

void loop() {}

Gruß Tommy

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.