PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Typkonvertierung int->double


pest
2010-01-24, 14:12:43
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

Gast
2010-01-24, 14:48:00
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.

pest
2010-01-24, 14:57:03
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.

Gast
2010-01-24, 15:03:49
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.

pest
2010-01-24, 15:07:15
ja das macht Sinn, klar

und ist mathematisch gesehen auch besser eine Zahl aus dem Intervall [0,1) zu erzeugen

danke :)

Xmas
2010-01-24, 15:18:57
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.

pest
2010-01-24, 15:33:53
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

Gast
2010-01-24, 23:45:32
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 ;)

Xmas
2010-01-25, 00:31:52
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.

pest
2010-01-25, 12:55:24
ich danke dir :)