rand() problem...
-
Hallo zusammen,
ich brauche eine kleine funktion, die mir immer einen wert im bestimmten Bereich liefert.
Hier kurz mein problem:
Ich habe eine polylinie mit x-punkten die ich abfahren will. An all den Punkten will ich "zufällig" einen neuen Punkt mit einem zufälligen Abstand und einem zufälligen Winkel setzen...
Hier mein code dazu:
void punkte_neu_vergeben() { srand((unsigned)time(0)); for(short i=1;i<m_mehrfachkrone;i++){ // hier wird die Polylinie punkt für punkt abgefahren GetVertex(cbp, krone_dupli, vertice, wp_vertice, vtype, arcRadius); double_gs zufall_winkel = zufall_zwischen(0.0, 2*PI); double_gs zufall_radius = zufall_zwischen(min_fenster, max_fenster); // Hier wird dann der neue Punkt gesetzt... } } /************************************************************/ Float64 zufall_zwischen(Float64 min, Float64 max) { cwdebug("Max(Float): %f Min %f\n", max, min); int max_int, min_int; max_int = max; min_int = min; cwdebug("Max: %d Min %d\n", max_int, min_int); double_gs zu = (rand() % (max_int - min_int + 1) + min_int); return(zu); }Allerdings erhalte ich immmer die selbe Zahl zurück....
Hat einer ne Idee wie ich den fehler beheben kann?
Danke Michael
-
Erstmal beschränkst du dir enorm deinen Wertebereich, indem du die übergebenen Parameter in int's umrechnest. Abeite lieber direkt mit den übergebenen float-Werten:
Float64 range = (max-min)/RAND_MAX; return rand()*range+min;Zweitens: Wo bekommst du ständig die selbe Zahl? Innerhalb eines Aufrufes der Funktion punkte_neu_vergeben()? Oder bei jedem neuen Aufruf? (wenn letzteres: pack den srand()-Aufruf mal aus der Funktion heraus)
-
nun, das ist eigentlich nicht so wild, weil ich sowieso nur eine zwahl zwischen 0 und 360 brauche um einen zufälligen Kreiswinkel zu bekommen... aber prima... ich habe rufe jetzt die srand funktion weggelassen und es schaut "gut"
aus...danke erstmal...
werde jetzt weitere tests machen.
Danke
Michael
-
michi0209 schrieb:
nun, das ist eigentlich nicht so wild, weil ich sowieso nur eine zwahl zwischen 0 und 360 brauche um einen zufälligen Kreiswinkel zu bekommen... aber prima...
Du berechnest aber einen zufälligen Wert zwischen 0 und 6 - und das dürfte etwas zu wenig sein

-
wieso "nur 0-6?? wie ommst du auf das?
-
Es kann natürlich sein, daß du die Bezeichnung PI etwas zweckentfremdet hast, aber normalerweise ist PI≈3.14. Das heißt, du übergibst beim ersten Aufruf von zufall_zwischen die Werte 0 und 6.28 - die sofort gestutzt werden auf 0 und 6.
-
ja stimmt.... da hast du recht!
Aber was ich nochmal fragen wollte! Was passiert eigentlich wenn ich die srand funktion nicht aufrufen? Denn es sieht so aus als ob meine "Zufallszahl" sich immer nur jede sekunde ändert...?!
-
srand() initialisiert den Zufallsgenerator mit dem übergebenen Wert. Wenn du es ganz weglässt, startet er bei jedem neuen Programmlauf mit 0. Wenn du es zu oft aufrufst, reinitialisierst du den Zufallsgenerator dagegen ständig neu - und bei identischem Startwert erhältst du auch eine identische Zufallsfolge.
Deswegen: srand() mußt du genau EIN MAL am Anfang deines Programms aufrufen - nicht mehr und nicht weniger.