2017-11-29 6 views
3

Ich habe das folgende C-Programm um Zufallszahlen in einer Schleife zu erzeugen. Während dies für Ganzzahlen gut funktioniert, wenn ich versuche, ein zufälliges Double zwischen 0 und 1 zu erzeugen, bleibt der Wert während der Schleife konstant.Zufallsdoppelschleife bleibt konstant

  • Warum passiert das?
  • Wie kann ich ein zufälliges Double in [0, 1] innerhalb einer Schleife erzeugen?

Quelle:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main(int argc, char** argv) { 
    srand(time(NULL)); 
    for(int i=0; i<5; i++) { 
     printf("%d\n", rand()); 
    } 
    for(int i=0; i<5; i++) { 
     printf("%d\n", (double) rand()/RAND_MAX); 
    } 
} 

Ausgang:

>gcc -O3 -o test test.c -lm 
>./test 
787380606 
1210256636 
1002592740 
1410731589 
737199770 
-684428956 
-684428956 
-684428956 
-684428956 
-684428956 
+1

die * Formatspezifizierer * für 'printf()' ist nicht richtig. –

+0

und außerdem: Was ist das Ergebnis von rand()/RAND_MAX? – dbrank0

+1

@ dbran0 sollte das nicht die Zufallszahl zwischen 0 und 1 normalisieren? Korrigiere mich, wenn ich falsch liege –

Antwort

6

Das Verhalten des Codes ist nicht definiert.

(double) rand()/RAND_MAX ist ein Ausdruck des Typs double. Das erfordert einen %f Formatbezeichner in Ihrem printf Aufruf.

(Beachten Sie auch, dass (double) rand()/RAND_MAX1.0 ziehen kann, die idiosynkratische ist. Normalerweise Sie RAND_MAX + 1 auf den Nenner schreiben.)

+0

Ich sehe ... die Umstellung auf '% f' funktioniert wie erwartet! –

+2

eher 'RAND_MAX + 1'? sonst könnte es sogar> 1 –

+0

@GregorSturm: In der Tat werden wir gemeinsam veröffentlichen! – Bathsheba