Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Typkonvertierung int->double
Kann mir jmd. den (inhaltlichen) Unterschied von folgenden beiden Codebeispielen erklären, steh grad auf dem Schlauch
r = (double)rand() / RAND_MAX
r = (rand() + 1.0)/ (RAND_MAX+2)
Gruss
pest
Vom Datentyp her gibt's keinen Unterschied (beide r sind double). Es werden der Variable r aber unterschiedliche Werte zugewiesen. Beispiel: 6.0 / 10 ist etwas Anderes als 7.0 / 12.
Gut die Frage war mißverständlich formuliert, btw. ganz so doof bin ich dann doch nicht ;)
mir geht es darum warum man die 2. Variante nehmen sollte, ich würde es wie 1. machen
wenn die Anforderung lautet eine (gleichverteilte) Zufallszahl zwischen [0,1] zu erzeugen.
Das einzige was mir einfallen würde, ist dass es dadurch keine 1 gibt, da RAND_MAX+2 immer min 1 größer ist als rand()+1.
ja das macht Sinn, klar
und ist mathematisch gesehen auch besser eine Zahl aus dem Intervall [0,1) zu erzeugen
danke :)
Nun, die Verteilung ist anders. Für RAND_MAX=4 bekommst du z.B. im ersten Fall
0/4, 1/4, 1/4, 3/4, 4/4
und im zweiten Fall
1/6, 2/6, 3/6, 4/6, 5/6
Es kommt auf den Anwendungsfall an, aber in beiden Fällen kannst du nicht jeder resultierenden Zahl ein symmetrisches Intervall um diese zuordnen. Dafür müsste die Verteilung so aussehen:
1/10, 3/10, 5/10, 7/10, 9/10.
(rand() + 0.5) / (RAND_MAX + 1.0)
Übrigens, (RAND_MAX + 2) ist gefährlich, da RAND_MAX gleich INT_MAX sein und damit RAND_MAX+2 nicht mehr als int dargestellt werden kann.
Nun, die Verteilung ist anders.
nein die Verteilung ist die Selbe, die Zahlen sind innerhalb des Intervalls gleichverteilt
Es kommt auf den Anwendungsfall an, aber in beiden Fällen kannst du nicht jeder resultierenden Zahl ein symmetrisches Intervall um diese zuordnen.
das verstehe ich jetzt nicht
(rand() + 0.5) / (RAND_MAX + 1.0)
Übrigens, (RAND_MAX + 2) ist gefährlich, da RAND_MAX gleich INT_MAX sein und damit RAND_MAX+2 nicht mehr als int dargestellt werden kann.
das habe ich nicht beachtet, dann nehme ich die Variante von dir
wie gesagt, die rechte Grenze 1 soll nicht dabei sein
Denke ich zu einfach, wenn ich behaupte:
[0;1] und ]0;1[ ?
Den Einwand mit RAND_MAX und INT_MAX jetzt mal außen vor gelassen und RAND_MAX -> inf ;)
nein die Verteilung ist die Selbe, die Zahlen sind innerhalb des Intervalls gleichverteilt
Anders formuliert: Die Ereignisse sind andere.
das verstehe ich jetzt nicht
Bei der von mir vorgeschlagenen Variante kann man jeder Zahl x ein Intervall [x-c; x+c) zuordnen, so dass das gesamte Intervall [0; 1) abgedeckt ist. Das kann man bei den anderen Varianten nicht.
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.