Viele Zufallszahlen erzeugen



  • Hallo, wie kann ich das

    srand(time(0));
    	int zahl=rand()%5;
    

    ergänzen so dass schnell viele Zufallszahlen erzeugt werden?



  • Lass doch einfach in einer Schleife ein Array mit Zufallszahlen füllen.
    Wie das geht wirst du doch wissen.



  • Sone schrieb:

    Lass doch einfach in einer Schleife ein Array mit Zufallszahlen füllen.
    Wie das geht wirst du doch wissen.

    Ok, das geht ja. Ich hab aber eine funktion geschrieben

    char Zufallszeichen(){
    
    	srand(time(0));
    	int zahl=rand()%5;
    	char a;
    
    	switch(zahl){
    		case 0 : a='j'; break;
    		case 1 : a='k'; break;
    		case 2 : a='l'; break;
    		case 3 : a='m'; break;
    		case 4 : a='n'; break;
    
    	}
    	return a;
    }
    

    Wieso wird mir hier immer das gleiche Zeichen/Zahl ausgegeben.



  • Nur einmal pro Programmlauf seeden.



  • Weil du in der Funktion immer wieder seedest. Du musst nur einmal seeden, und zwar am Anfang des Programms.



  • Außerdem lässt sich das weitaus schöner lösen:

    char Zufallszeichen()
    {
    	static const char Zeichen[] = "jklmn";
    
    	return Zeichen[rand() % (sizeof(Zeichen) - 1)];
    }
    


  • Oder gleich

    return static_cast<char>('j' + rand() % 5);
    


  • Wenn man ganz pedantisch ist, geht das so nicht - der Standard garantiert nur für '0' bis '9', dass sie in einer Reihe liegen, nicht für Buchstaben. Zum Beispiel ist in EBCDIC i = 137, j = 145. (Speziell mit jklmn funktioniert das aber zufällig auch da)

    Übrigens gibt es in C++11 deutlich hübschere Zufallszahlengeneratoren. Beispielsweise

    #include <ctime>
    #include <iostream>
    #include <random>
    
    int main() {
      std::mt19937 rng(std::time(0)); // Mersenne-Twister mit Periode 2 ** 19937
      std::uniform_int_distribution<> dist(0, 4); // gleichmäßige Verteilung zwischen 0 und 4
    
      for(int i = 0; i < 10; ++i) {
        std::cout << dist(rng) << '\n';
      }
    }
    

    uniform_int_distribution fängt dann auch die kleine Ungleichmäßigkeit, die rand() % 5 hat.



  • seldon schrieb:

    Wenn man ganz pedantisch ist, geht das so nicht - der Standard garantiert nur für '0' bis '9', dass sie in einer Reihe liegen, nicht für Buchstaben.

    Ja, ich weiss. DAS ist aber eine Sache, auf die ich grundsätzlich sch*** ;). Alle Encodings die ich irgendwo unterstützen müsste haben a-z und A-Z in der erwarteten Reihenfolge hintereinander liegen.

    Grundsätzlich hast du natürlich recht.

    Zum Beispiel ist in EBCDIC i = 137, j = 145. (Speziell mit jklmn funktioniert das aber zufällig auch da)

    Krass, ich hätte da kein Beispiel gewusst.


Anmelden zum Antworten