ich möchte mit dem ESP alle x Stunden random eine Zahl zwischen 1 und 30 auswählen und die Zahl dannach aus den "Pool" löschen, sodass diese nicht mehr ausgewählt werden kann. So möchte ich, dass zwar random die Zahlen ausgewählt werden, aber keine doppelt gewählt wird, bis alle zahlen von 1-30 durchgegangen sind. Dann das ganze wieder von vorne.
Hab leider so gar keine Ahnung, wie ich das anstellen soll.
Hat jemand eine idee?
Du machst dir ein Array[31] vom typ bool umd füllst es mit Nullen.
Dann schaust Du ob in dem Array die Position mit der gezogenen Zahl als Index = false (0) ist. Ist das der Fall, setzt du die Position auf true(1), was bedeutet, dass diese Zahl schon mal gezogen wurde. Ist diese Position bereits auf true, verwirfst du die Zahl und suchst nach einer neuen.
Das kann aber zum Ende hin lange dauern, bis eine Zahl kommt, die noch nicht gezogen wurde…..
Wenn du keinen "beliebigen Container" kennst, aus dem du Elemente löschen kannst, nimmst du halt ein Array, das dir sagt, welche Indizes schon gewählt wurden.
Dann brauchst du eine Funktion, die dir sagt, welches das x-te Element ist, mit Überspringen und Mitzählen bereits gelieferter Werte.
Die rufst du jeweils mit x = random(Rest-Anzahl) auf
bool got[30]; // true = hatten wir schon
byte next(byte c) {
byte i = random(c); // liefert einen Wert 0 .. c-1
return get(i);
}
byte get(byte i) {
// liefere i mit überspringen bereits gelieferter Werte
byte x;
for (x = 0; x <= i; x++)
if (got[x]) i++;
x--;
got[x] = true;
return x;
}
void setup() {
Serial.begin(115200);
//int i;
//while ((i=Serial.read()) == -1) {} // Warte auf eine Eingabe als randomSeed
//randomSeed(i); // verschiedene, aber reproduzierbare Reihen
byte count = sizeof (got);
while (count) Serial.println(next(count--));
}
void loop() { }
Vielleicht.....
Da habe ich mal meine Libstdc++ Kenntnisse und Wühlkisteninhalte ausgegraben und auf einem ESP getestet.
Funktioniert mit array und vector gleich gut.
Andere nicht getestet