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.