random_shuffle an einem struct?



  • hallo,

    wie kann man die STL-funktion random_shuffle an einem struct durchführen?

    das struct sieht so aus:

    struct Solution {
           int Customer_ID;
           double tourLength;
         };
    

    ich würde gerne die Customer_ID durchmischen.
    wisst ihr wie es gehen könnte?

    lg,
    Don_Gunito



  • Du solltest dich genauer ausdrücken.

    Normalerweise wendet man die std::random_shuffle() auf Container an, du hast aber nichts dergleichen gesagt.

    Hast du einen Container mit Solution -Einträgen, und unter diesen Einträgen willst du die Customer_ID -Member zufällig vertauschen?



  • hallo nexus,

    danke für den input, ich habe mehrere instanzen eines structs (s.o.) in einen vector gepackt

    vector<Customer> customer;
    

    und nun will ich die Customer_ID durchmischen.

    Hast du einen Container mit Solution-Einträgen, und unter diesen Einträgen willst du die Customer_ID-Member zufällig vertauschen?

    ich denke genau das hab ich gemacht...

    besten dank für deine hilfe.



  • Hi,

    also ich kann mir gerade nicht vorstellen, wo Dein Problem liegt. die Container-Algorithmen laufen auf einem vector<int> genauso wie auf einem vector<mein_ganz_persoenliches_wildes_spezial_struct>....

    Oder möchtest Du die beinhalteten Objekte selbst verändern (also nicht nur ihre Reihenfolge im Container) ?

    Hast Du sowas in der Art:

    [1, 1.2]      [2, 1.2]
    [2, 2.3]  --> [1, 3.4]
    [3, 3.4]      [3, 2.3]
    

    vor?
    Dafür wäre random_shuffle() nicht gedacht. Oder Du müsstest erst Deinen vector "teilen", mischen und hinterher wieder neu zusammensetzen.
    Sowas in der Art (ungetestet)

    int IDSelector(Solution const& s) { return s.customerID; }
    int tourLengthSelector(Solution const& s) { return s.tourLength; }
    
    vector<Solution> solutions; // irgendwie füllen
    
    vector<int> customerIDs;
    vector<double> tourLengths;
    transform(solutions.begin(), solutions.end(), back_inserter(customerIDs), IDSelector);
    transform(solutions.begin(), solutions.end(), back_inserter(tourLengths), tourLengthSelector);
    random_shuffle(customerIDs.begin(), customerIDs.end());
    // ob man das auch für die tourLengths braucht, ist aufgabenspezifisch
    
    vector<Solution> newSolutions(customerIDs.size());
    for(size_t i=0; i<customerIDs.size(); ++i) newSolutions[i] = Solution(customerIDs[i], tourLengths[i]); // geeigneten Ctor mal vorausgesetzt
    

    Geht bestimmt auch besser - aber mal als Ideenskizze...

    Gruß,

    Simon2.



  • hallo nochmals,

    also, was ich wirklich will ist die reihenfolge der structs im vector durchmischen.

    so hätte ich es gern:

    [1, 1.2]      [2, 2.3]
    [2, 2.3]  --> [1, 1.2]
    [3, 3.4]      [3, 3.4]
    

    mit

    random_shuffle(customer.begin(), customer.end());
    

    geht das.

    besten dank leute!



  • Don_Gunito schrieb:

    also, was ich wirklich will ist die reihenfolge der structs im vector durchmischen.

    so hätte ich es gern:

    [1, 1.2]      [2, 2.3]
    [2, 2.3]  --> [1, 1.2]
    [3, 3.4]      [3, 3.4]
    

    Das wiederspricht sich aber schon ein wenig - aber ich nehm mal an, du hast die skizze missverstanden?!

    struct Solution {
           int Customer_ID; //erster wert
           double tourLength; //zweiter wert
         };
    

    also lt. skizze wölltest du die customer-ids zufällig tauschen?! da du das aber offenbar nicht willst reicht ein einfacher random_shuffle -Aufruf, wie du ihn auch geschrieben hast, aus.

    bb


Anmelden zum Antworten