keine zufallszahlen mit randomize()



  • Hallo miteinander

    Leider konnte mir das Internet und auch die Suche in diesem Forum nicht wirklich weiterhelfen. Das Problem wurde wohl öfters erörtert, doch bin ich wohl zu blöd, die Lösung für meinen Fall zu finden.

    Ich habe das Problem, dass ich eine Zufallszahl per randomize(), bzw. nachher per rand() definieren möchte. Leider bekomme ich immer dieselben Zahlen. So weit ich weiss, hängt das damit zusammen, dass randomize im Sekundentakt wechselt, oder???
    Ich habe eine Lösung gefundne, indem ich sleep(1) in den Code einfüge. Leider dauert es dementsprechend länger...

    Ich habe die Aufgabe ein "Schiffe versenken" zu programmieren. Das Programm muss die Schiffe per Zufall in ein 16x16 grosses Feld einfügen.

    Ich poste hier mal die Methode, mit welcher ich die 2er-Schiffe einfügen möchte (es müssen 4 Stück sein). Ich wäre echt froh, wenn ihr mir helfen könnt.

    Übringens, anhand meines Textex, meines Problems und des folgenden Codes werde ihr wohl schnell erkennen, dass ich noch ziemlicher Anfänger bin.

    Hier meine Methode:

    void Csink::setshipzwei()
    {
       counter=0;
       do
       {
          sleep(1);
    
       	randomize();
       	ykoo = rand()%14+1;
       	zkoo = rand()%14+1;
    
       	for(int t=0; t<16; t++)
       	{
       		for (int l=0; l<16; l++)
          	{
             	if (t==ykoo && l==zkoo && field[t][l]!='*')
             	{
    					field [t][l] = '*';
             	}
             	else
                {
                	if (field [t][l] != '*')
                	{
             			field [t][l] = '.';
                	}
                }
          	}
       	}
          randomize();
       	direction=rand()%4;
    
    		if (direction==0 && field[ykoo-1][zkoo] != '*')
    	   {
    	   	field[ykoo-1][zkoo] = '*';
             counter++;
    	   }
    
    	   if (direction==1 && field[ykoo+1][zkoo] != '*')
    	   {
    		   field[ykoo+1][zkoo] = '*';
             counter++;
    	   }
    
    	   if (direction==2 && field[ykoo][zkoo-1] != '*')
    	   {
    	   	field[ykoo][zkoo-1] = '*';
             counter++;
    	   }
    
    	   if (direction==3 && field[ykoo][zkoo+1] != '*')
    	   {
    	   	field[ykoo][zkoo+1] = '*';
             counter++;
    	   }
          else
          {
          }
       }
       while(counter<=3);
    }
    

    Kann mir jemand erklären, wieso ich immer die gleichen Zahlen bekommen, bzw. wie ich das ändern kann??

    Vielen Dank für die Hilfe,
    nemico



  • schau doch mal in die ANSI-C FAQ, dort wird erklärt, wie man Zufallszahlen erzeugt.

    Am Anfang deines Codes einfach die folgende Zeile einfügen, dann werden die Werte bei jedem Mal anders.

    srand( (unsigned) time(NULL) ) ;
    


  • lustig schrieb:

    Am Anfang deines Codes einfach die folgende Zeile einfügen, dann werden die Werte bei jedem Mal anders.

    srand( (unsigned) time(NULL) ) ;
    

    Ich nehme an, dass seine randomize-Funktion genau das tut.

    Der entscheidende Punkt ist, dass man das nur einmal tun soll.



  • Hallo miteinander

    Herzlichen Dank für eure Postings!

    Den von euch geposteten Code habe ich auch schon gesehn und ausprobiert, leider ohne Erfolg (war wohl am falschen Ort).
    Ich habe das Codeelement nun nochmals eingefügt und nun funktioniert es schon besser. Irgendwelche Probleme bestehen noch immer, aber die krieg ich (hoffentlich) auch noch raus 🙂

    Wie gesagt, ich danke euch für die schnelle Hilfe!!

    Gruss, nemico



  • nemico schrieb:

    Den von euch geposteten Code habe ich auch schon gesehn und ausprobiert, leider ohne Erfolg (war wohl am falschen Ort).

    Lies die Postings doch nocheinmal. Sprich

    int main()
    {
      srand((unsigned)time(0)); // _einmal_ und nirgends sonst
      // ...
    }
    

    sollte dein Problem beheben. Wenn nicht poste mal die randomize()-Definition...



  • finix schrieb:

    ... Wenn nicht poste mal die randomize()-Definition...

    Ich danke für deine Hilfe. Meinen Code zu posten würde wohl das Forum sprengen, sollte ich jedoch weiterin keinen Erfolg haben, werde ich wohl doch auf diese Möglichkeit zurückgreifen müssen.

    Könnte das Problem auch daran liegen, dass ich den Code in einer Klasse (im Methodenfile) und nicht unter dem "normalen" main einsetze???

    Sorry, ich weiss meine Ausdrucksweise ist haarsträubend, doch kann ich es noch nicht besser 🙄

    nochmals danke, Gruss "us dä Schwiiz", nemico



  • nemico schrieb:

    Könnte das Problem auch daran liegen, dass ich den Code in einer Klasse (im Methodenfile) und nicht unter dem "normalen" main einsetze???

    Ja, das könnte ein Grund sein - der Zufalls-Generator sollte genau einmal im Programm initialisiert werden, sonst läuft er aus dem Takt (mit dem Ergebnis, daß er wenig zufällige Werte zurückliefert).

    (das muß nicht unbedingt in der main() sein)



  • nemico schrieb:

    finix schrieb:

    ... Wenn nicht poste mal die randomize()-Definition...

    Ich danke für deine Hilfe. Meinen Code zu posten würde wohl das Forum sprengen, sollte ich jedoch weiterin keinen Erfolg haben, werde ich wohl doch auf diese Möglichkeit zurückgreifen müssen.

    es war nur nach der definition der funktion randomize() gefragt.
    aber vrauchste nicht zu posten.
    randomize() macht nix anderes als srand(time(0))
    und du sollst randomize() nicht innerhalb von Csink::setshipzwei aufrzfen, sondern nur einmal, am besten in der main() oder sowas ähnlichem, vielleicht einer Dialog::On_Create() oder so.


Anmelden zum Antworten