Random Float zwischen 0.0 und 1.0



  • Hey Leute,
    weiß jemand wie ich eine zufällige Kommazahl zwischen 0.0 und 1.0 bekomme!
    Brauche das für mein OpenGL Programm.
    Danke schonmal im vorraus.
    MfG
    Justus

    #include <GL/glut.h>
    #include <stdlib.h> 
    #include <time.h>
    
    void Szene() {
    
    	double a = (double)rand()/RAND_MAX;
    
    	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	//Hintergrund Farbe setzen
    	glClear(GL_COLOR_BUFFER_BIT);	//Color Buffer clearen
    	glPointSize(5);	//Punkt Größe
    	glBegin(GL_POINTS);	//PUNKT zeichnen
    		glColor3f(1.0f, 0.0f, 0.0f);	//Farbe vom PUNKT
    		glVertex2f(a, 0);	//PUNKT Koordianten (XY)                     
    	glEnd();	//ENDE von Punkt zeichnen
    
    	glFlush();	//Rendern
    }
    
    int main(int argc, char **argv) {
    	glutInit(&argc, argv);	//Initialisierung von GLUT
    	glutCreateWindow("JUSTUS TEST");	//WINDOW Name
    	glutInitWindowSize(300, 300);	//Größe des Fensters
    	glutInitWindowPosition(50, 50);	//Position des Fensters
    	glutReshapeWindow(500, 500);	//Größe des Fensters auf Wunsch Wert umändern
    	glutDisplayFunc(Szene);	//Welche Szene gerendert werden soll
    	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);	//RGB = Default Farben	DOUBLE = Für schönere Animationen	DEPTH = Depth Buffer
    	glutMainLoop();	//Glut in Endlosschleife setzen
    
    	return 1;
    }
    


  • Indem du den Rückgabewert von rand() durch den Maximalwert teilst.
    Achte darauf, dass du eine Fließkommadivision machst.

    #include <stdlib.h>
    
    double a = (double)rand()/RAND_MAX;
    


  • Da kommt immer dasselbe Ergebis 😞
    Hat irgendwer ne Idee wie das weggeht!


  • Mod

    justusreto schrieb:

    Da kommt immer dasselbe Ergebis 😞
    Hat irgendwer ne Idee wie das weggeht!

    Benutze einmalig srand beim Programmstart, um dem Zufallszahlengenerator einen Startwert zuzuweisen. Die Krux liegt natürlich darin, bei jedem Programmstart mit einem anderen Wert zu starten, aber woher nehmen? In absolut reinem C kommt eigentlich nur die Uhrzeit in Frage ( time aus time.h ), hat aber den Nachteil, dass sich diese nur einmal pro Sekunde ändert. Wenn man das Betriebssystem bemüht kommt man normalerweise auch relativ leicht an die Prozess-ID des Programms ran, die bei jedem Start eine andere ist (außer nach vielen Programmstarts, wenn sie wieder von Vorne anfängt). Wenn man diese mit der Zeit verwurstet (z.B. indem man mit beiden eine Hashfunktion wie md5 füttert), kommt schon recht zuverlässig jedes Mal eine andere Zahl heraus. Wie das genau geht, kommt auf's Betriebssystem an, für das man entwickelt.

    Praktisch alle modernen Betriebssysteme bieten auch selber einen Zufallsgenerator an, der dann für das gesamte System gilt und daher für dein Programm stets andere Werte liefern wird. Das ist daher in der Regel eine sehr gute Quelle für den Startwert eines eigenen Zufallsgenerators und oft einfacher als die Kombination Zeit + Prozess-ID. Wie das genau geht, hängt natürlich auch wieder vom System ab.

    PS: Spam nicht rum, oder du fliegst raus!



  • Wenn du nur eine bestimmte Genauigkeit haben willst, kannst du dir auch eine zufallszahl im Bereich 0 bis entsprechende zehnerpotenz erstellen und dann durch diese zehnerpotenz teilen, also für bspw. 3 nachkommastellen zahl von 0 - 1000 und durch 1000 dividieren.

    clock() kannst du grundsätzlich auch als seed verwenden


  • Mod

    HansKlaus schrieb:

    clock() kannst du grundsätzlich auch als seed verwenden

    Das fängt ggf. bei jedem Start von 0 an zu zählen. Wenn das Programm jedes Mal ungefähr gleich schnell läuft, hat man gute Chancen, öfters den gleichen Wert zu bekommen!



  • Aber der war doch relativ schnell am zählen und wenn benutzereingaben dazwischen sind, ist die Wahrscheinlichkeit doch relativ hoch, dass die Werte unterschiedlich sind.

    Ist ja nur eine weitere Möglichkeit....


  • Mod

    HansKlaus schrieb:

    Aber der war doch relativ schnell am zählen und wenn benutzereingaben dazwischen sind, ist die Wahrscheinlichkeit doch relativ hoch, dass die Werte unterschiedlich sind.

    Benutzereingaben würden es in der Tat recht unvorhersehbar machen, aber oft ist das Seeden des Zufallsgenerators eines der ersten Dinge, die ein Programm macht. Dann besteht der Pool der möglichen Seeds nur aus einem recht kleinen Zeitfenster, in dem man recht gute Chancen hat, öfter mal die gleiche Mikrosekunde zu treffen. Man kann es aber als weitere Entropiequelle zu den anderen (Uhrzeit, PID) hinzu fügen, falls man nicht den besseren Weg über den Zufallsgenerator des OS wählt.


Anmelden zum Antworten