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!
-
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
austime.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
-
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....
-
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.