Zufallszahlen - mit Begrenzung - Suche half nicht
-
Hallo liebe C++ler,
ich brauche für eine auf AD&D basierendes Rollenspiel ständig Zufallszahlen und zwar mit variierenden Maximalwerten. Allerdings sollen sehr oft Werte zwischen 1 und 10 erwürfelt werden. Das ist auch erst einmal mein Hauptaugenmerk. Mit folgendem Programm, das ich teils aus diesem Forum, teils aus der MS C++ Doku habe, passiert es unwahrscheinlich oft, das ich eine gleiche Zufallszahl erwürfle. Was mache ich falsch? Und welche Bibliotheken brauche ich dafür wirklich? Liegt es an der srand Initialisierung? LG Tobi#include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <time.h> void main(void) { srand( (unsigned)time( NULL ) ); int zufallszahl; zufallszahl = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0))); cout << zufallszahl; }
-
zufallszahl = (rand () % 10) + 1;Das hat eine ordentliche Verteilung und ist unabhängig von float Rundungsfehlern. Wenns zufälliger sein soll, dann benutz Boost.Random.
/edit: stdio und iostream in einem Programm macht keinen Sinn.
/edit2:#include <iostream> #include <cstdlib> #include <ctime> int main() { std::srand (std::time (0)); int zufallszahl = std::rand () % 10 + 1; std::cout << zufallszahl << std::endl; }.. so, jetzt fühl ich mich besser :p

-
Schonwieder mit Modulo? Tobi86 Ansatz war durchaus besser!

-
Objektiv mit Sicherheit, aber da dieser Ansatz scheinbar nicht ordentlich funktioniert, hätte er die Alternative testen können. Am angebrachtesten ist und bleibt die Benutzung eines besseren Zufallszahlenverfahrens.
-
Hallo und guten Abend nochmal!
Ich danke Dir, .filmor, aber irgendwie ist mir die Generierung immer noch nicht ganz geheuer...
Ich habe die boost-Seite besucht, muss aber ehrlich sagen, dass ich als C++-Noobie total überfordert bin. Auch habe ich in Englisch kein Oxford-Abzeichen.
Kann mir also nochmal jemand helfen, an besseren Code für Zufallszahlen heranzukommen? Das was ich von boost.random verstanden habe, klang sehr interessant, aber, was mich vor allem verwirrte war die Tatsache, das es wohl sehr viele Methoden gibt ZZ zu generieren. Welchen Code muss ich mir nun besorgen und welche Header-Datei muss ich mir laden?
Ich wäre für eure Hilfe sehr dankbar.
LG
Tobi
EDIT: achja, ums nochmal hervorzuheben: es geht mir vor allem nur um ganzzahlige Zufallszahlen im maximal 2stelligen Bereich.
Danke
-
Das schwierigste wird wohl das einrichten von Boost sein.
Ich hatte mir das mal vor einiger Zeit angeschaut, und hier ist ein Beispiel:
#include <iostream> #include <iomanip> #include <algorithm> #include <vector> #include <boost/random/linear_congruential.hpp> #include <boost/random/mersenne_twister.hpp> using namespace std; class RandomNumber { private: boost::rand48 r; public: RandomNumber() { r.seed(static_cast<int>(time(0))); } int operator() (int n) { return static_cast<int>( static_cast<unsigned long long>(n) * r() / std::numeric_limits<int>::max() ); } }; class CRandomNumber { public: CRandomNumber() { srand(time(0)); } int operator() (int n) { return static_cast<int>( static_cast<unsigned long long>(n) * rand() / RAND_MAX ); } }; template<class T> void TestRandom(T functor) { const int numbers = 10; const int times = 50000000; std::cout << "Durchlaeufe: " << times << std::endl; int arr[numbers]; memset(arr, 0, sizeof(arr)); unsigned long long prozent = 0, prozentAlt = -1; time_t start = time(0); for(int i = 0; i < times; ++i) { prozent = static_cast<unsigned long long>(i) * 100 / times; if(prozent != prozentAlt) { cout << "\r" << setw(2) << (prozentAlt = prozent) << "%"; } ++arr[functor(numbers)]; } std::cout << "\r" << "Zeit: " << (time(0) - start) << " Sekunden" << std::endl << "Zahlen: " << numbers << std::endl; for(int i = 0; i < numbers; ++i) { std::cout << setw(6) << i << ": " << setw(7) << fixed << setprecision(3) << arr[i] * 100. / times << "%" << std::endl; } std::cout << std::endl << std::endl; } int main() { using namespace std; TestRandom(RandomNumber()); TestRandom(CRandomNumber()); }mfg.