Frage zum srand()



  • Hi Leute!

    Ich hab mir folgende Methode gschrieben:

    void matrix::Input()
    {
    	//setzen des random seeds
    	//srand(time(NULL));
    
    	//füllt das Array mit Zufallswerten
    	for(int i=0; i<m; i++)
    	{
    		srand(time(NULL));
    		for(int j=0; j<n; j++)
    		{
    			feld[i] = rand() % 10;
    		}
    	}
    }
    

    Diese Methode soll mir das Array, das die Gesamtlänge m*n hat mit Zufallszahlen befüllen. Und zwar so: immer wenn die innere for-Schleife fertig ist und dann die äußere um eins weitergeht, soll mir das srand() (vor der inneren Schleife) einen neuen seed für "neue" Zufallszahlen setzen, damit quasi jede Zeile der Matrix mit unterschiedlichen Zufallszahlen besetzt ist. Das Problem ist, dass mit dieser Methode jede Zeile die gleichen Zufallszahlen hat! Was passt da nicht?

    Diese Methode gibt leider dann auch noch diesen Fehler aus, von dem ich nicht so recht weiß, wo diese Datentypkonvertierung herkommt:

    Warnung 1 warning C4244: 'Argument': Konvertierung von 'time_t' in 'unsigned int', möglicher Datenverlust



  • Die Warnung gilt vermutlich dem time(NULL), das du auch in unsigned int casten kannst.

    srand() ist nur zur einmaligen Initialisierung vorgesehen. Dein Programm läuft so schnell ab, dass es im Normalfall in der Schleife immer mit dem gleichen Zeitwert initialisiert wird und deshalb auch immer die gleichen Zufallszahlen liefert. Da rand() eine Art Zähler speichert, wird es dir auch bei mehrmaligem Aufruf unterschiedliche Ergebnisse liefern.



  • Da rand() eine Art Zähler speichert, wird es dir auch bei mehrmaligem Aufruf unterschiedliche Ergebnisse liefern.

    Das heißt das nun, dass ich das srand() weglassen soll und ich nur mit rand() die Zufallszahlen berechnen lassen soll? Dann bekomme ich zwar in einer Zeile unterschiedliche Werte nicht aber Zeilen übergreifend...



  • srand() einmal in der main, dann nciht mehr.



  • Sollte deine Matrix nicht eigentlich aus einem zweidimensionalen Array oder ähnlichem bestehen? Deine innere Schleife bringt nämlich überhaupt nichts...



  • Meine Matrix besteht aus einem eindimensionalen array. Der matrix wird für den use nur durch eine printmethode in die form einer zweidimensionale matrix gebracht. wobei ich grad sehe, dass ich damit probleme hab...



  • vip@r schrieb:

    Da rand() eine Art Zähler speichert, wird es dir auch bei mehrmaligem Aufruf unterschiedliche Ergebnisse liefern.

    Das heißt das nun, dass ich das srand() weglassen soll und ich nur mit rand() die Zufallszahlen berechnen lassen soll? Dann bekomme ich zwar in einer Zeile unterschiedliche Werte nicht aber Zeilen übergreifend...

    Ich weiß nicht, ob das schon klar ist, aber mit der selben Zahl "geseedete" Pseudozufallszahlengeneratoren liefern immer die genau gleiche Zahlenfolge. Also wenn du mit time(NULL) seedest, dann bekommst du innerhalb einer Sekunde immer die selbe erste Zahl der gleichen Folge. Und eine Gleichverteilung kann auch nicht garantiert werden.
    Das ist so ziemlich das Schlimmste, das man machen kann. Üblicherweise wird srand() nur ein einziges Mal im Programm aufgerufen.


Log in to reply