Hallo, eine Frage an euch weil ich steig selber nicht mehr durch ;) (Vergleichsoperand?)



  • for (x=1; x<anzahl+1; x++)
    { //for 1 auf

    if(variable1=='m')
    { //if 1 auf

    (zufall1=rand()% 30+1);
    cout<<"Die Zufallszahl ist "<<zufall1<<endl<<endl;

    cout<<"\t\t\t\t "<<x<<" ";

    switch (zufall1)
    { //switch 1 auf
    case 1:
    cout << "aussage1"<<endl;
    break;
    case 2:
    cout << "aussage2"<<endl;
    break;
    case 3:
    cout << "aussage3"<<endl;
    break;
    case 4:
    cout << "aussage4"<<endl;

    Das ist ein kleiner Ausschnitt von meinem Programm.
    Es funktioniert wunderbar.

    Was passiert:
    Falls die Variable1 Buchstabe m ist, geht es weiter zum Zufallsrechner.
    Der spuckt dann je nach case (1-30) Aussage Nr. (1-30) aus.
    Dann geht er wieder nach oben zur Forschleife und fängt von neuem an bis die anzahl erreicht ist die in der Forschleife gefordert werden.

    Das hier ist mein Zufallsgen. :

    time_t t;

    time(&t);
    srand((unsigned int)t);

    Der spuckt unterschiedliche Zahlen aus die mehr oder weniger Abhängig von der Zeit sind;

    Jetzt will ich aber jede Aussage nur 1 und der Zufallrechner bringt schon mal die gleichen Zahlen;
    Gibt es irgendeinen "Vergleich-Befehl" den ich in die (Switch) hineinbauen kann sodass er vor jedem CASE den er setzt, überprüft ob er den schon gesetzt hat oder nicht;

    Ich hoff i versteht was ich meine 😉

    Gruß Josef



  • Jetzt will ich aber jede Aussage nur 1 und der Zufallrechner bringt schon mal die gleichen Zahlen;

    Das verstehe ich nicht. was bedeutet dieser Satz?



  • ich meinte Jeden Aussagentyp also Case nur 1mal.
    Wenn der Zufallsrechner z.b. 4 bringt dann spuckt er Aussage 4 aus.
    Dann springt er wieder zurück wegen der Forschleife und der Zufallsrechner bringt z.b. 8 dann geht er auf CASE und spuckt Aussage 8 aus.
    Jetzt passiert es aber das er wieder die 4 ausspuckt und nochmals die Aussage 4 bringt.
    Genau das will ich aber nicht mehr.



  • Speicher dir doch einfach in nem Vektor ab, welche Aussagen bzw. zufallszahlen du schon hattest und frag das entsprechend immer ab.
    Wenn du die entsprechende Aussage schonmal ausgegeben hast - generierst du einfach ne neue Zufallszahl.



  • Ich würde auch auf den Mersenne Twister zurückgreifen, der produziert öfters unterschiedliche Zahlen. Ich pers. finde ihn subjektiv besser als rand().
    rya.



  • inter2k3 schrieb:

    Speicher dir doch einfach in nem Vektor ab, welche Aussagen bzw. zufallszahlen du schon hattest und frag das entsprechend immer ab.
    Wenn du die entsprechende Aussage schonmal ausgegeben hast - generierst du einfach ne neue Zufallszahl.

    Was ich noch nicht ganz verstehe ist das Problem mit der For-schleife.
    Weil ich könnt ja auch nen Zufallsgenerator einbauen also so nen "lottozahlen"generator.
    z.B.

    int main() {
    // "Zufall" initialisieren
    srand(time(0));

    // 6 Zahlen ziehen
    int ziehung[6];
    for(int i = 0; i < 6; ++i) {
    bool schonDa;
    int zahl;
    do { // doppelte "Zufallszahl" vermeiden
    schonDa = false;
    zahl = rand() % 49 + 1;
    for(int j = 0; j < i; ++j) {
    if(ziehung[j] == zahl) {
    schonDa = true;
    break;
    }
    }
    } while(schonDa);
    ziehung[i] = zahl;
    }
    // irgendwas damit machen...
    for(int foo = 0; foo < 6; ++foo)
    std::cout << ziehung[foo] << std::endl;
    }

    Der hier wirft 6 Zahlen aus wobei man das ja schnell auf 1 abändern kann.
    Da kann ich mit BOOL abfragen ob die Zahl schon mal gesetzt wurde oder nicht, aber da ist das Problem wenn er den gesetzt hat fängt ja die Forschleife wieder von vorne an und er weiß nicht mehr das er die schon gesetzt hat und fängt wieder von vorne an.



  • Die Lottoziehung könnte beispielsweise so aussehen:

    std::srand(time(NULL));
    	std::vector<int> lotto;
    	int newLottoNumber;
    	for (int i = 0; i!= 6; ++i) {
    		do {
    			newLottoNumber = rand()%49+1;
    		} while (std::find(lotto.begin(),lotto.end(),newLottoNumber)!=lotto.end());
    		lotto.push_back(newLottoNumber);
    	}
    

    Kurze Erläuterung:
    Dass die for-Schleife 6 mal durchlaufen wird ist klar denke ich, du möchtest ja 6 Lottozahlen haben.
    Innerhalb der for-Schleife ist eine weitere Schleife (do-while), die solange die Bedingung erfüllt ist durchlaufen wird.

    Ich verwende hier find (header: algorithm). find sucht nun in meinem vector lotto, ob die neu errechnete Zufallszahl schon vorhanden ist. Falls dies der Fall ist, erhalte ich einen Iterator, der auf diese Zahl zeigt. Dieser Iterator ist immer ungleich dem Iterator, der das Ende des vectors darstellt.
    Wenn also der von find gelieferte Iterator ungleich dem Ende-Iterator ist, muss ich nochmal eine neue Zahl errechnen.

    Wenn die neu errechnete Zufallszahl noch nicht im vector gespeichert ist, kann find sie nat+rlich auch nicht finden und gibt mir deshalb den Iterator zurück, der das Ende des vectors darstellt.
    Wenn das der Fall ist - wird die do-while Schleife abgebrochen und ich füge die neue Zufallszahl in den vector ein.

    Grüsse.

    P.S.: Noch einfacher wäre es mit einem set. Aber das kannst du dir ja selber mal anschauen.



  • oder so:

    std::srand(time(NULL));
    
    std::vector<int> alleZ;
    
    // pack alle Zahlen rein
    for(int i=1;i<50;++i) 
      alleZ.push_back(i);
    
    // misch den Vector durch
    std::random_shuffle(alleZ.begin(),alleZ.end());
    
    std::cout << "6 aus 49: ";
    
    // gib die ersten 5 aus
    for(int i=0;i<5;++i) 
      std::cout << alleZ.at(i) << ",";
    // und die sechste
    std::cout << alleZ.at(5) <<std::endl;
    
    std::set<long long int> cppWegeNachRom;
    long long int i(0);
    while(1) cppWegeNachRom << ++i;
    

Anmelden zum Antworten