Zufallszahlen erzeugen
-
Hallo,
ich hab folgendes Problem.
Ich muss ein Spiel programmieren, dass Hindernisse in ein Spielfeld setzt.
Um die Hindernisse bei jedem Start auf einem anderen Feld zu plazieren, muss ich
Zufallszahlen generieren. Damit hab ich auch keine Probleme, solange es nicht zu viele sind. Ab einer Anzahl von 20 Stück, wird des Programm immer langsamer und ich muss im höchsten Level ungefähr 80 Hindernisse einbauen, was dazu führt, dass es mehrere Minuten benötigt um das Feld zu erzeugen.Gibt es vielleicht eine andere Möglichkeit Zufallszahlen zu generieren, als ich sie in meinem Prog erzeuge.
Ich wäre dankbar für jede Hilfe.void compute_random_free_cell(char w[XRANGE][YRANGE], int *x, int *y) { bool ok; ok = false; int cell_x=*x; int cell_y=*y; while(ok==false) { srand((unsigned) time(NULL)); /* Initialisierung des Zufallszahlengenerators */ *x=(rand() % 24); /* Aufruf des Zufallszahlengenerators */ *y=(rand() % 50); if (w[*x][*y] == EMPTY) { ok = true; } } return; }
Das Spielfeld ist 50 Breit und 25 Hoch.
Gruss
Torsan
-
fuer deine zwecke gehoert srand in main() und nur einmal aufgerufen.
-
Ich hab aber leider eine Vorgabe, nach der ich eine eigene Prozedur schreiben muss die diese Felder generiert, um einen "Hyperjump" zu ermöglichen der meine Spielfigur auf ein neues Feld setzt, wenn man bedrängt wird, und um "Roboter" und "Hindernisse" beim Start auf ein neues Feld zu setzen.
So kann ich für jede Aufgabe, diese Prozedur aufrufen.
-
dann steck das srand() wenigstens nicht in den loop.
und rueck den code bitte etwas besser ein (nur tabs oder nur spaces, nicht mischen). den loop erkennt man kaum.frag doch besser mal nach, ob du das srand() ueberhaupt brauchst. vielleicht wirds ja schon fuer dich in der main() gemacht?
-
Vielen Dank,
ich hab das srand aus der schleife genommen, und jetzt läuft es top.
thx
-
wieviele durchlaeufe hat die schleife im schnitt?
(such dir nen debugger und profiler, dann wirds programmieren einfacher: gdb, gprof, gcov)
-
ich hab mal getestet wie oft die schleife durchlaufen wird.
Es fangt mit eins an und hört mit 115 auf.
In diesem Feld werden 99 Hindernisse eingebaut.
Was kann mit dem debugger oder profiler testen?
-
mit gdb kannst du das programm und alle variablen schrittweise verfolgen.
mit gprof kannst du sehen, welche zeilen die meiste zeit verbrauchen.
mit gcov kannst du sehen, wie oft jede zeile ausgefuehrt wird.
-
ich werds gleich mal testen.
-
Kein Wunder dass das Programm mit srand() in der Schleife lange braucht - Wenn das errechnete Feld leer ist ändert es sich dank time(0) erst eine Sekunde später, d.h. es wird paar tausend mal festgestellt dass das Feld leer ist bevor ein anderes probiert wird