Zufallsfunktion in Abhängigkeit



  • hallo.

    ich habe einen int ( bestimmmer ), der aus verschiedenen vectoren ( mit strings darin ) zufällig einen auswählt.
    dies geschieht durch verschachtelte ifs, also

    if (bestimmer == 2) { benutzedaszweite() }
     else if ( bestimmer == 3 { benutzedasdritte() }
     usw.
    

    das problem ist das folgende: man kann auch auswählen, bestimmte vectoren nicht zu benutzen. diese auswahl habe ich in booleans gespeichert.

    jetzt brauche ich eine formel für die zufallsfunktion für jeden fall.

    also für alles einen raum zwischen 2 und 5.
    sowas ist kein problem. wie kann ich aber darauf reagieren wenn beispielsweise die nummer 3 ausgestellt wird, und alles andre läuft?

    dann bräuchte ich eine zufallszahl von 2, 4 oder 5.

    eine idee wäre vllt das lösen mit hilfe eines arrays, dachte ich mir. also die aktivierten zahlen in ein array und dann den index per zufall auswählen.

    gibt es da noch bessere möglichkeiten oder ist das ausreichend? gibt es dinge, die ich beachten muss?

    greets 😃



  • Ich würde es auch mit einem Auswahlarray machen, das scheint mir die beste Möglichkeit zu sein. Genauer: Du kannst einen std::vector<short> erstellen, und für jedes true in deinem Bool-Array den entsprechenden Index hinzufügen.

    Die andere Möglichkeit wäre natürlich, bei einer nicht zulässigen Zufallszahl noch einmal eine neue Zufallszahl generieren zu lassen. Das könntest du dann so oft wiederholen, bis eine zulässige Zahl kommt. Allerdings rate ich dir davon ab, da meistens mehr Rechenzeit benötigt wird und auch überflüssige Berechnungen durchgeführt werden.



  • hallo nochmal 🙂

    //....
    vector<int> bestimmerPool;
    		if(!bestimmerPool.empty()) {
    			bestimmerPool.erase(bestimmerPool.begin(), bestimmerPool.end());
    		}
    		if(b2) {
    			bestimmerPool.push_back(2);
    		}
    		if(b3) {
    			bestimmerPool.push_back(3);
    		}
    		if(b4) {
    			bestimmerPool.push_back(4);
    		}
    		if(b5) {
    			bestimmerPool.push_back(5);
    		}
    		bestimmer = rand() % bestimmerPool.end()+1;
    //...
    

    habe das jetzt wie oben gelöst. bei der letzten hier geposteten zeile krieg ich jedoch nen compilerfehler:

    [C++ Fehler] E2096 Ungültige Strukturoperation

    was soll das? liefert vector::end keinen int zurück oder woran liegt das hier?

    bestimmer ist int und der bestimmerPool ist vector<int>

    greets



  • was soll das? liefert vector::end keinen int zurück oder woran liegt das hier?

    Ja. Es liefert nen Iterator.

    1. Mach dir mal ein array von bool anstatt b2, b3 ...
    2. Dann gehst du da mit ner schleife drüber und fügst die entsprechnde zahl (index) in deinen bestimmerPool ein, wenn boolArray[index] true ist. Anstatt 100 if zu machen.
    3. bestimmer = bestimmerPool[rand() % bestimmerPool.size()];



  • std::vector<>::end() liefert keinen Integer, sondern einen Iterator (also eine Art Zeiger) zurück. Deshalb kannst du ihn auch nicht in dem Ausdruck verwenden.
    Aber mach es doch auf folgende Weise:

    bestimmer = rand() % bestimmerPool.size();
    

    Ausserdem würde ich statt den einzelnen Variabeln ein bool-Array machen.

    if(!bestimmerPool.empty()) {
    			bestimmerPool.erase(bestimmerPool.begin(), bestimmerPool.end());}
    

    Willst du damit den Vektor leeren?
    Dann würde ich aber Folgendes empfehlen:

    bestimmerPool.clear();
    


  • gut, danke. soweit alles behoben.

    ich würde ja gern ein bool-array einrichten, allerdings sind die bools parameter der funktion. oder sollte ich sie am anfang der funktion in ein array packen? vom code-anteil wäre es doch aber in etwa dasselbe?



  • Wenn du die Bools nur innerhalb der Funktion benötigst, würde ich das Array gerade lokal deklarieren. Ansonsten übergibst du eben einen Zeiger auf das Array. Oder du machst auch das mit Vektoren.



  • just-another-programmer schrieb:

    gut, danke. soweit alles behoben.

    ich würde ja gern ein bool-array einrichten, allerdings sind die bools parameter der funktion. oder sollte ich sie am anfang der funktion in ein array packen? vom code-anteil wäre es doch aber in etwa dasselbe?

    Das bool array schon da verwenden, wo die werte gesetzt werden, also da

    just-another-programmer schrieb:

    man kann auch auswählen, bestimmte vectoren nicht zu benutzen.



  • hallo.

    also, hab jetzt das array eingebaut.

    vielen dank euch beiden 🙂


Log in to reply