2009-11-07 16 views
10

ich diese Funktion hatte einen Pseudo-Random-Schwimmer zwischen 0 .. 1 inklusive zu erhalten:Zufall float Zahl

float randomFloat() 
{ 
     float r = (float)rand()/(float)RAND_MAX; 
     return r; 
} 

Allerdings ist es immer 0,563585 zurück. Die gleiche Nummer, egal wie oft ich meine Konsolenanwendung ausführe.

EDIT:

Hier ist meine gesamte Anwendung, wenn nötig:

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

float randomFloat() 
{ 
     float r = (float)rand()/(float)RAND_MAX; 
     return r; 
} 

int main(int argc, char *argv[]) 
{ 
    float x[] = { 
     0.72, 0.91, 0.46, 0.03, 0.12, 0.96, 0.79, 0.46, 0.66, 0.72, 0.35, -0.16, 
     -0.04, -0.11, 0.31, 0.00, -0.43, 0.57, -0.47, -0.72, -0.57, -0.25, 
     0.47, -0.12, -0.58, -0.48, -0.79, -0.42, -0.76, -0.77 
    }; 

    float y[] = { 
     0.82, -0.69, 0.80, 0.93, 0.25, 0.47, -0.75, 0.98, 0.24, -0.15, 0.01, 
     0.84, 0.68, 0.10, -0.96, -0.26, -0.65, -0.97, -0.03, -0.64, 0.15, -0.43, 
     -0.88, -0.90, 0.62, 0.05, -0.92, -0.09, 0.65, -0.76  
    }; 

    int outputs[] = { 
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 
    }; 

    int patternCount = sizeof(x)/sizeof(int); 

    float weights[2]; 
    weights[0] = randomFloat(); 
    weights[1] = randomFloat(); 

    printf("%f\n", weights[1]); 

    float learningRate = 0.1; 

    system("PAUSE"); 
    return 0; 
} 
+3

Beachten Sie, dass die Funktion rand() nicht sehr gut 'Zufallszahlengenerator zu sein braucht. Es ist wahrscheinlich egal, ob Sie nur zwei Dezimalstellen zwischen 0 und 1 benötigen; es würde, wenn Sie 4 oder mehr Dezimalstellen benötigten. Wenn Sie mehr Plätze benötigen, schauen Sie sich die 'drand48()' -Familie von Funktionen an: http://www.opengroup.org/onlinepubs/9699919799/functions/drand48.html –

Antwort

13

Sie benötigen

srand(time(NULL)); 

aufrufen, bevor rand zum ersten Mal verwendet wird. time ist in <time.h>.

EDIT: Wie Jonathan Leffler darauf hinweist, wird dies leicht vorhergesagt, also versuchen Sie es nicht für die Kryprografie.

+2

Seien Sie vorsichtig bei der Verwendung von time(); es ist ziemlich leicht vorhersagbar und daher können Ihre zufälligen Sequenzen auch vorhergesagt werden. Es mag in diesem Fall keine Rolle spielen, aber seien Sie vorsichtig im Allgemeinen. –

10

Das liegt daran, dass der C Zufall Generator ein Pseudo ist -random Generator (und das heißt, BTW, eine sehr gute Sache, mit vielen Anwendungen). (Der ANSI C-Standard erfordert einen solchen Pseudozufallsgenerator.)

Jedes Mal, wenn Ihre Konsolenanwendung neu gestartet wird, verwendet denselben [default] Seed für den Zufallsgenerator.

durch eine Zeile wie

srand(time(NULL)); 

Zugabe erhalten Sie eine deutliche Samen jedes Mal bekommen, und die Reihenfolge der Zahl mit entsprechend variieren hergestellt.
Hinweis: Sie müssen nur einmal srand() aufrufen, nicht vor jedem Aufruf von rand().

bearbeitet: (Test/Debug-Zeit Hinweis)
[aus einer Bemerkung von Artelius] Zu Testzwecken ist es am besten srand (SOME_CONST) und den Wert der Konstante zwischen den Läufen ändern. Auf diese Weise können Sie, wenn sich ein Fehler aufgrund einer Kombination von Zufallszahlen manifestiert, diese reproduzieren.

+5

Zu Testzwecken ist es am besten, srand (SOME_CONST) zu setzen und den Wert der Konstante zwischen den Läufen zu ändern. Auf diese Weise können Sie, wenn sich ein Fehler aufgrund einer Kombination von Zufallszahlen manifestiert, diese reproduzieren. – Artelius

+0

@artelius, ausgezeichneter Vorschlag. Ich habe dies als Anmerkung zur Antwort selbst hinzugefügt! – mjv

+0

@artelius und mjv: es ist ein guter Punkt; Es kann auch eine gute Idee sein, dem Benutzer zu erlauben, den Seed in der Befehlszeile anstelle von time() anzugeben, und es kann oft (aber nicht immer) eine gute Idee sein, den verwendeten Seed zu melden (ob von Befehlszeile oder eine andere Quelle) für die Arbeit mit den Ergebnissen. –

2

Sie haben einen zufälligen Samen initialisieren mit

void srand (unsigned int seed); 

Sie können die Systemzeit zum Beispiel.

1

Nennen Sie es mehr als einmal? rand() liefert immer das gleiche Pseudozufallszeichen. Vielleicht möchten Sie srand() mit einem netten Startwert wie der aktuellen Uhrzeit aufrufen.

4

drand48 ist perfekt für Ihre Verwendung, besser als (float)rand()/RAND_MAX, weil

Die drand48() und erand48() Funktionen nicht negativ ist, mit doppelter Genauigkeit zurück, Gleitkommawerte, gleichmäßig verteilt über das Intervall [0,0, 1,0 ].

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int main() { 
    int i; 

    srand48(time(NULL)); 

    for (i = 0; i < 10; i++) 
     printf("%g\n", drand48()); 

    return 0; 
}