Keine doppelten Werte generieren?



  • Hallo,

    ich erzeuge mir zufällige Werte und will aber, dass keine Werte doppelt auftauchen. Deswegen speichere ich mir in einer Liste, welche Werte bereits existieren. Jetzt kann ja das Problem auftauchen, dass irgendwann alle möglichen Werte schonmal erzeugt wurden. Dann wär auch ein doppelter Wert OK, nur wie programmiert man das am elegantesten?

    Wert v = ZufallsWert();
    
    int cnt = 0;
    while( istInListe(v) && cnt <= GRENZE) {
         v = ZufallsWert();
         ++cnt;
    }
    

    Oder wie würdet ihr das machen?



  • Dann fängst Du einfach wieder von vorne an (leere Liste).

    Statt einer "Liste" könntest Du auch ein "Set" benutzen. Das Prüfen, ob ein bestimmtes Element vorhanden ist, läuft mit einem std::set schneller.

    Wenn Du aber wirklich annähernd so viele Zahlen generieren willst, wie es Möglichkeiten gibt, wäre eine zufällige Permutation geeigneter, da Du sonst für eine Ziehungen evtl relativ viele Versuche brauchst. Die zufällige Permutation könnte man komplett im Speicher generieren (also einen vektor anlegen, mit allen möglichen Werten füllen und zufällig permutieren) oder sogar "prozedural" erzeugen (geht in die Richtung Kryptographie; denn das, was AES und co machen, sind auch nur "große Permutationen").



  • Dazu gab´s doch unlängst einen Thread zu ähnlicher Thematik...

    Lottozahlen


Anmelden zum Antworten