Liste mit zufallsgenerator mischen



  • Hey @ll,
    ich habe ein kleines Problem. Ich möchte eine Datei laden und die einzelnen Zeilen dann per Zufallsgenerator in eine neue Datei speichern.
    Das Problem ist entweder es fehlt die Hälft oder Strings sind doppelt.

    Bis jetzt mache ich es so. Ich lade die Datei in ein TStringList.
    Dann will ich einzelne Zeilen per Zufallsprinzip in eine TListBox schreiben.

    for(i=0 ; i < BCSFile->Count ; i++)
      {
        rand=random(this->BCSFile->Count);
        this->ListBox1->Items->Insert(0,this->BCSFile->Strings[rand]);
        this->BCSFile->Delete(rand);
      }
    

    Also BCSFile ist die TStringList in die die Datei geladen wird. Danach erzeuge ich eine Zufallszahl im Bereich der maximal möglichen Zahlen.
    Dann nehme ich den String[randomize] aus der TStringListe und füge ihn der ListBox hinzu. Dann lösche ich den String in der TStringList.

    Folgendes problem tritt jetzt auf: Wenn der Befehl Delete(rand) enthalten ist erhalte ich nur die Hälfte der Zeilen in der TListBox wie in der Originaldatei. Entferne ich diesen Befehl so habe ich doppelte Einträge in der TLIstBox. Jeder String in der neuen Liste soll eineraus der alten sein nur durcheinander. Wo liegt mein Gedankenfehler ??

    FGGF



  • The Godfather schrieb:

    for(i=0 ; i < BCSFile->Count ; i++)
      {
        rand=random(this->BCSFile->Count);
        this->ListBox1->Items->Insert(0,this->BCSFile->Strings[rand]);
        this->BCSFile->Delete(rand);
      }
    

    Hi,
    nachd dem Delete verändert sich BCSFile->Count und danach bist du aber schon ein Element weiter! Entweder du machst nach dem del noch ein i--; oder die durchläufst dein array rückwärts!

    MfG

    Alexander Sulfrian

    PS: Du kannst glaube ich die this Dinger da weg nehmen!



  • Hallo,

    Bloss mal so aus Spass eine Variante ohne Löschen

    vector<int> test;
    for( unsigned int i=0; i<10; ++i) test.push_back(i);
    random_shuffle(test.begin(), test.end());
    for(i=0 ; i < BCSFile->Count ; ++i) 
        ListBox1->Items->Add(BCSFile->Strings[test[i]]);
    

    Ciao


Anmelden zum Antworten