Brauche Hilfe bei Zufallszahlen-Spiel
-
double Rand( double a, double b ) // a -> from, b-> to { return ( b - a ) / RAND_MAX * (double)rand() + a; }
-
Jollie Joker schrieb:
double Rand( double a, double b ) // a -> from, b-> to { return ( b - a ) / RAND_MAX * (double)rand() + a; }
Tut zwar das Gleiche, aber für C++ wäre das hier schöner:
return ( b - a ) / RAND_MAX * static_cast<double>(rand()) + a;
-
Hallo
Und bitte beim nächsten Posten von Code beachten : sfds
bis bald
akari
-
Das gibt aber eine double an... das problem habe ich in meinem Spiel auch, ich brauche einen int und der compiler meckert immer wenn ich das einfach convertiere, es gibt etwas ähnliches für int's mit der rand-Funktion, jedoch ist da bei mir das gleiche problem, wie bei dully128... es bleibt nicht in der Spanne... 10-100 werden z.B. 103 oder so, das ist bei Prozent irgendwie doof!!!
int shields; shields = (rand() %100+ 10); std::cout << shields
Ausgabe teilweise über 100...
jedoch habe ich diese Syntax irgendwo direkt übernommen... (Buch tut weis ich nicht mehr)
-
rand()%(max-min+1)+min
Wobei durch das Modulo niedrigere Zahlen geringfügig bevorteilt werden können. Aber das sollte bei einer geringen Spanne nicht zu bemerken sein.
-
#include <stdio.h> #include <stdlib.h> int irand( int von, int bis ) { return von + (int)((bis - von + 1) * rand()/(RAND_MAX+1.0)); } int main() { int i; srand(time(NULL)); for ( i=0; i<20; i++ ) printf("%d\n", irand( 10, 100 )); return 0; }
-
Diese Lösung hatte ich bereits im Verdacht, ich war nur sehr verwirrt weil es anders irgendwo stand, thx.
Das Problem der Bevorzugung ist wirklich klein, da rand selber keine besonders gute Zufallszahlen erstellt, oder liegt das alles nur am modulo?
-
Horroreyes schrieb:
Das Problem der Bevorzugung ist wirklich klein, da rand selber keine besonders gute Zufallszahlen erstellt, oder liegt das alles nur am modulo?
-
modulo bevorzugt nix und niemanden!!!
-
Oh doch, aber wie gesagt hat das nur bei grossen Spannen eine Auswirkung.
Nehmen wir als Beispiel die natürlichen Zahlen in einer Spanne [0, 7] modulo 5:
i i%5 0 0 1 1 2 2 3 3 4 4 5 0 6 1 7 2
Wie unschwer zu erkennen ist, kommen die Ergebnisse 3 und 4 nur einmal vor, die anderen aber je zwei Mal. Das heisst, die Wahrscheinlichkeit für kleinere Zahlen ist bei der Modulo-Operation grösser. Bei sehr grossen Spannbreiten ist dieser Unterschied jedoch vernachlässigbar.
Horroreyes schrieb:
Das Problem der Bevorzugung ist wirklich klein, da rand selber keine besonders gute Zufallszahlen erstellt, oder liegt das alles nur am modulo?
Zugegeben, der lineare Kongruenzgenerator
rand()
ist nicht gerade der beste Zufallszahlengenerator, aber für die meisten Anwendungen reicht er aus. Inwiefern meinst du, er erstelle schlechte Zufallszahlen?
-
[quote="Jollie Joker"][cpp]#include <stdio.h>
return von + (int)((bis - von + 1) * rand()/(RAND_MAX+1.0));
Vielen Dank euch allen für die schnellen Antworten, ihr habt mir sehr geholfen
. Ich habe die zitierte Zeile in mein Programm eingefügt und es fuktioniert auch bei hohen Spannen wie z.B. von 100000 bis 100010.
Leider bin ich noch etwas grün hinter den Ohren, was C++ (und Programmieren generell) angeht. Könnte mir jemand erklären warum man hohe Spannen nicht mit Modulo generieren kann?
Auch verstehe ich die eingefügte Zeile leider nicht:gesucht = von + (int)((bis - von + 1) * rand()/(RAND_MAX+1.0))
warum das int??, warum (bis - von +1)? und was hat es mit RAND_MAX+1.0 auf sich?
Die Literatur die mir zur Verfügung steht kann mir leider nicht weiterhelfen.
-
Nun, rand() liefert dir eine Zahl zwischen 0 und RAND_MAX. Wenn du jetzt Modulo eine Zahl rechnest, von der RAND_MAX ein vielfaches ist, kommen die Zahlen zwischen 0 und RAND_MAX%deinMax einmal öfter vor. Um so niedriger deine maximale Zahl ist, um so öfter wird ja umgebrochen und um so öfter kommt jede Zahl vor. Da macht dieses "einmal öfter" nichts aus. Wenn dein Maximum allerdings RAND_MAX/2 + 10 ist, hast du schon ein Problem.
return von // wir rechnen per Zufall einen Wert aus der in der Spanne liegt und addieren diesen auf das Minimum + (int)((bis - von + 1) * /* Die Spanne (bis-von) wird mit der ermittelten Zahl multipliziert. So hat man einen Wert von 0 bis inklusive Maximum der Spanne. Das +1 ist nötig, da wir bei der Berechnung der Zufallszahl die 1.0 rauslassen. Würden wir die 1 drinlassen, würde diese dank Rundung nur 1 mal in RAND_MAX Fällen vorkommen.*/ rand()/(RAND_MAX+1.0)); // Bestimmung einer Zahl zwischen 0.0 und exklusive 1.0
-
Fellhuhn schrieb:
Nun, rand() liefert dir eine Zahl zwischen 0 und RAND_MAX. Wenn du jetzt Modulo eine Zahl rechnest, von der RAND_MAX ein vielfaches ist, kommen die Zahlen zwischen 0 und RAND_MAX%deinMax einmal öfter vor. Um so niedriger deine maximale Zahl ist, um so öfter wird ja umgebrochen und um so öfter kommt jede Zahl vor. Da macht dieses "einmal öfter" nichts aus. Wenn dein Maximum allerdings RAND_MAX/2 + 10 ist, hast du schon ein Problem.
return von // wir rechnen per Zufall einen Wert aus der in der Spanne liegt und addieren diesen auf das Minimum + (int)((bis - von + 1) * /* Die Spanne (bis-von) wird mit der ermittelten Zahl multipliziert. So hat man einen Wert von 0 bis inklusive Maximum der Spanne. Das +1 ist nötig, da wir bei der Berechnung der Zufallszahl die 1.0 rauslassen. Würden wir die 1 drinlassen, würde diese dank Rundung nur 1 mal in RAND_MAX Fällen vorkommen.*/ rand()/(RAND_MAX+1.0)); // Bestimmung einer Zahl zwischen 0.0 und exklusive 1.0
Hmm kann das jemand nochmal leicht verständlich (also für Dumme) erklären? Ich muss das Programm vorstellen, und leider verstehe ich noch einiges nicht an der Programmzeile. Z.B. kann ich mir unter RAND_MAX nichts vorstellen, ist dies das Maximum was mit der rand-Funktion erzeugt werden kan, also die höchste Zahl?