Problem bei dem Aufrufen einer Funktion in einer Schleife
-
Hallo, ich hab das Problem das ich eine Schleife bauen möcht in der immer wieder eine Funktion für eine "Random"-Zahl durchlaufen soll.
Hier erstmal die Funktion:
int random () { float x,y,z,pi; float xe,ye; unsigned int k=0,q=0; srand((unsigned int) time(NULL)); //Startwert aus Chromometer für Zufallsgenerator while(fabs(1.-pi/M_PI)>0.00001) //M_PI := PI (Konstante) //fabs := Betrag { x=(float)rand()/(float)RAND_MAX; //Zufallszahlen geteilt durch max. Zufallszahl y=(float)rand()/(float)RAND_MAX; z=sqrt((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)); if(z <=0.5) k++; q++; if (k!=0) pi=4./((float)q/(float)k); } int g = 100 * x; return g; }
Die Schleife:
for( i = 0; i <= 499; i++) { xe[i] = random (); } for( j = 0; j <= 499; j++) { xe[j] = random (); } printf("xe0 = %d\n ye0 =%d\n xe1= %d\n xe2 = %d", xe[0], ye[0],xe[1], xe[2]);
Kann mir jemand erklären warum das nicht geht oder wie ich das machen müsste damit es geht?
Wie ihr seht will ich 1000 Zahlen so erzeugen, und die sollen natürlich unterschiedlich sein...
Ich hoffe ihr könnt mir weiterhelfen.
Grüße
Nod
-
was hast für ne Fehlermeldung? Mögliche Fehlerquellen:
- random als Functionsname
- math lib nicht gelinkt
- header fehlt
- float xe,ye; eher in main() o.ä. verschieben
- die zweite schleife überschreibt die erste schleifewoher kommt der algo?
-
- random als Functionsname
Die Funktion funktioniert ja einmal, darum denk ich können wir das ausschließen
- math lib nicht gelinkt
Ist gelinkt
- header fehlt
Ist auch da
- float xe,ye; eher in main() o.ä. verschieben
Hab ich gemacht, aber selbes Ergebnis
- die zweite schleife überschreibt die erste schleife
Kann das denn möglich sein? die erste endet doch, und der Wert von xe ist ein Randomwert zwischen 1 und 100, der 2te von ye ist allerdings meistens Quatsch.
Danke aber erstmal für deine Hilfe
-
versuch mal in der 2. schleife ye[j] statt xe[j]
-
ok, das behebt das Problem das ye einen "unmöglichen" Wert hat
Danke, blödes Copy-Paste
Aber leider werden jetzt ALLE Felder mit ein und demselben Wert gefüllt, ich kenn mich leider mit Funktionen nicht so gut aus, meistens will ich nur einen ReturnWert haben, aber wie kriege ich das nun hin das in jeder Schleife die Funktion einen neuen Return Wert ausgibt? (Der Rechenaufwand... ich freu mich schon - sollte man lieber einen Randomwert an der Stelle berechnen lassen wo man ihn braucht oder einige am Anfang und dem User das als "Lade-Bildschirm" verkaufen?
Aber danke erstmal für die Hilfe bisher
Edit:
Ok, hab es jetzt lösen können, der Randomalgorithmus nutzt ja die Zeit, aber die Berechnungszeit ist zu kurz um das dadurch ein Neuer Wert entstehen würde... heißt, wenn ich das immer dann direkt ausrechnen lasse wo ich es brauche dann passt wieder alles.
Danke für deine Hilfe C-Newbie
-
Nod88 schrieb:
ok, das behebt das Problem das ye einen "unmöglichen" Wert hat
Danke, blödes Copy-Paste
Aber leider werden jetzt ALLE Felder mit ein und demselben Wert gefüllt, ich kenn mich leider mit Funktionen nicht so gut aus, meistens will ich nur einen ReturnWert haben, aber wie kriege ich das nun hin das in jeder Schleife die Funktion einen neuen Return Wert ausgibt? (Der Rechenaufwand... ich freu mich schon - sollte man lieber einen Randomwert an der Stelle berechnen lassen wo man ihn braucht oder einige am Anfang und dem User das als "Lade-Bildschirm" verkaufen?
Aber danke erstmal für die Hilfe bisher
Edit:
Ok, hab es jetzt lösen können, der Randomalgorithmus nutzt ja die Zeit, aber die Berechnungszeit ist zu kurz um das dadurch ein Neuer Wert entstehen würde... heißt, wenn ich das immer dann direkt ausrechnen lasse wo ich es brauche dann passt wieder alles.
Danke für deine Hilfe C-Newbie
Habe den Code nicht genauer angeguckt, aber ein häufig gemachter Fehler ist es, das srand() wiederholt aufgerufen wird.
Allerdings brauchst du genaugenommen srand nur EINMAL am ANFANG deines Programms aufrufen.
int main() { srand((unsigned int) time(NULL)); }
-
Danke für den Hinweis, allerdings ist srand() nur einmal aufgerufen.
Gibt es eine Möglichkeit srand zu modifizieren? Also um etwa -1?
int main() { srand((unsigned int) time(NULL) - 1); }
So etwa?
-
Also die Uhrzeit als Seed zu nehmen ist eh nicht so günstig, evtl. bietet dein os
auch eine Möglichkeit für bessere Start Werte. Unter Linux geht da zeitweise
/dev/random. Ist aber alles davon abhängig was du machen möchtest, bzw. für
welchen Anwendungs Zweck die Daten sind.int main(){ unsigned int x = 0; ,mytime = time(NULL); while(x++){ if(x==mytime)x=0; srand(mytime - x); } }
-
Nod88 schrieb:
Danke für den Hinweis, allerdings ist srand() nur einmal aufgerufen.
Gibt es eine Möglichkeit srand zu modifizieren? Also um etwa -1?
int main() { srand((unsigned int) time(NULL) - 1); }
So etwa?
Selbstverständlich hast du srand mehrmals aufgerufen. Jedes Mal wenn du random() aufrufst, rufst du auch wieder srand() auf. Nimm srand() aus der Funktion und pack es stattdessen ganz am Anfang des Programms.
Und die Zeit als Seed zu nehmen ist in den meisten Fälle gar kein Problem. Vorausgesetzt du rufst srand() nur einmal am Anfang des Programms auf und nich t wiederholt...