2016-04-20 9 views
1

Wenn ich rand() mit srand() verwendet, um eine Zufallszahl in [0,1] zu generieren, gab es mir Zahlen wie: 0,70324, 0,70328, 0,70321 ...zufällige Gleitkommazahl ranging [0,1] in c

Sie waren Unterschied erst in den letzten ein oder zwei Ziffern, während ich zufällig float Zahlen zu erhalten wie 0.1,0.7,0.3 ....

gedacht war, wie ich, dass zufällige Fließkommazahl bekommen könnte wie statt Unterschied in der letzten Ziffer machen?

Hier ist mein Code:

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

int main(){ 
    int i; 
    float randomNum; 
    for ( i=0; i<10; i++){ 
     srand((unsigned int)time(NULL)); 
     randomNum = ((float)rand())/RAND_MAX; 
     printf("%f\n",randomNum); 
    } 
    return 0; 
} 
+6

Bewegen Sie 'srand' außerhalb der Schleife. Rufen Sie es einmal am Anfang eines Programms auf. Sie setzen den RNG mit einer Sekunde Granularität zurück. –

+1

Randnotiz: Selten habe ich gesehen, dass der Bereich '[0.0 bis 1.0]' benötigt wird, aber der Bereich '[0.0 1.0)' (Oberes Ende nicht 1.0) – chux

+1

Hinweis: mit typischen 32-Bit 'int' und 32-bit 'float',' ((float) rand())/RAND_MAX; 'wird nicht das gleiche Vorkommen von' float' Werten liefern. '1.0f' wird aufgrund der Rundung von' (float) rand() '64 mal häufiger vorkommen als' 0.0f' – chux

Antwort

4

Sie srand() nur einmal anrufen sollte, zu Beginn des Programms. Rufen Sie es vor jedem Anruf an rand() nur macht die Ergebnisse besser vorhersagbar, da jedes Mal, wenn Sie es anrufen mit einer Nummer wahrscheinlich sehr ähnlich zu der vorherigen.

2

die Zeile nach

srand((unsigned int)time(NULL)); 

zum Start des Programms das heißt kurz nach main.

Sie müssen den Zufallsgenerator nur einmal einsetzen.

1

srand() initialisiert nur den Pseudozufallszahlengenerator mit einem Datenelement, das als Seed bezeichnet wird. Die rand()-Funktion verwendet dann diesen Seed, um Zufallszahlen zu erzeugen. Danach basiert jeder Anruf auf rand() auf der vorherigen Zufallszahl, die generiert wurde. Sie sind nicht dazu aufgefordert, die Nummer srand() mehr als einmal aufzurufen. (Sie können dieses Verhalten tatsächlich in einem der rand's implementation sehen)

Das Problem hier ist, dass time() gibt Ihnen die aktuelle Uhrzeit in Sekunden, also wenn Sie den Generator zu initialisieren und rufen rand() jedes Mal, wenn Sie die gleiche Nummer, bis eine Sekunde vergehen wird.