Immer die gleiche Zufallszahl



  • Hallo.

    Ich möchte zufällige Koordinaten erstellen lassen. Folgenden Code habe ich geschrieben:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define PATH "D:/AssociateNodes/GenerateRandomFiles/"
    #define N 10
    
    int random(int upperbounds);
    
    int main(){
    	printf("Generating random files for debug...\n");
    
    	double *X0, *Y0, *Z0, *X1, *Y1, *Z1;
    	unsigned long *O21;
    	unsigned long i=0, j=0, k=0, l=0;
    
    	X0 = (double*)calloc(N, sizeof(double));
    	Y0 = (double*)calloc(N, sizeof(double));
    	Z0 = (double*)calloc(N, sizeof(double));
    
    	X1 = (double*)calloc(N, sizeof(double));
    	Y1 = (double*)calloc(N, sizeof(double));
    	Z1 = (double*)calloc(N, sizeof(double));
    
    	O21 = (unsigned long*)calloc(N, sizeof(unsigned long));
    
    	for(i=0;i<N;i++){
    		//Random number for field i
    		X0[i]=1./(random(100)); 
    		Y0[i]=1./(random(100));
    		Z0[i]=1./(random(100));
    
    		//Plotting points
    		printf("Node0[%lu]: (%2.6f/%2.6f/%2.6f)\n", i, X0[i], Y0[i], Z0[i]);
    	}
    
    	printf("Program finished. Exit with any key...\n");
    	getchar();
    	return 0;
    }
    
    int random(int upperbounds){
       //int zahl, zufallszahl;
       srand(time(NULL));
       return rand() % upperbounds;
    }
    

    Das Programm funktioniert soweit, dass er mir bei jedem Aufruf eine Liste mit unterschiedlichen Koordinaten ausgibt, jedoch sind diese alle gleich.

    Also, ich bekomme eine Liste:
    Node[0]: (0.00111/0.0011/0.0011)
    Node[1]: (0.00111/0.0011/0.0011)
    Node[2]: (0.00111/0.0011/0.0011)
    ...

    und beim nächsten Aufruf z.B.
    Node[0]: (0.1600/0.1600/0.1600)
    Node[1]: (0.1600/0.1600/0.1600)
    Node[2]: (0.1600/0.1600/0.1600)

    Kann mir jemand helfen? Wieso liefert die Funktion innerhalb von main immer den gleichen Werr zurück?



  • Weil du jedesmal srand aufrufst. Mach das nur einmal beim Programmstart.



  • Woher kommt dieser Mythos srand ständig aufzurufen?
    Man ruft es einmal auf, am Anfang der main. Nicht in jedem Aufruf.



  • ...funktioniert jetzt super.

    Hat er dadurch jedes mal von Null angefangen zu zählen?


  • Mod

    CJens schrieb:

    Hat er dadurch jedes mal von Null angefangen zu zählen?

    Nein, von time(NULL), also der Uhrzeit, auf die Sekunde genau. Bloß ist eine Sekunde für ein Computerprogramm eine ziemlich lange Zeit, daher war das fast immer der gleiche Wert.


Anmelden zum Antworten