2009-11-07 10 views
10

Ho scritto questa funzione per ottenere una pseudo float casuale compreso tra 0 .. 1 compreso:galleggiante a caso il numero

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

Tuttavia, è sempre tornando 0,563,585 mila. Lo stesso numero non importa quante volte eseguo la mia applicazione console.

EDIT:

Ecco tutta la mia domanda, se necessario:

#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

Nota che la funzione rand() non deve essere un 'buon' generatore di numeri casuali. Probabilmente non importa se hai solo bisogno di due cifre decimali tra 0 e 1; sarebbe se avessi bisogno di 4 o più posizioni decimali. Se hai bisogno di più posti, guarda la famiglia di funzioni 'drand48()': http://www.opengroup.org/onlinepubs/9699919799/functions/drand48.html –

risposta

13

è necessario chiamare

srand(time(NULL)); 

prima di utilizzare rand per la prima volta. time è in <time.h>.

EDIT: Come Jonathan Leffler sottolinea, questo è facilmente previsto, quindi non provare a utilizzarlo per cryprography.

+2

Stai attento all'uso di time(); è piuttosto facilmente prevedibile e quindi anche le sequenze casuali possono essere previste. Potrebbe non essere importante in questo caso, ma attenzione in generale. –

10

Ciò perché casuale generatore C è un pseudo generatore -Random (e cioè proposito, una cosa molto buona, con molte applicazioni). (Lo standard ANSI C richiede un generatore pseudo-casuale)

In sostanza ogni volta che l'applicazione della console viene riavviata, utilizza lo stesso seme [predefinito] per il generatore casuale.

aggiungendo una riga come

srand(time(NULL)); 

si otterrà un seme distinto ogni volta, e la sequenza di numero prodotto con variare di conseguenza.
Nota: è sufficiente chiamare srand() una volta, non prima di ogni volta che si chiama rand().

Edit: (Test/Debug in tempo suggerimento)
[da un'osservazione di Artelius] A scopo di verifica, è meglio srand (SOME_CONST), e modificare il valore della costante tra le esecuzioni. In questo modo se un bug si manifesta a causa di una combinazione di numeri casuali, sarai in grado di riprodurlo.

+5

Per scopi di test, è preferibile eseguire il comando srand (SOME_CONST) e modificare il valore della costante tra le esecuzioni. In questo modo se un bug si manifesta a causa di una combinazione di numeri casuali, sarai in grado di riprodurlo. – Artelius

+0

@artelius, ottimo suggerimento. Ho aggiunto questo come una nota alla risposta stessa! – mjv

+0

@artelius e mjv: è un buon punto; può anche essere una buona idea permettere all'utente di specificare il seme sulla linea di comando invece di usare time(), e può spesso (ma non sempre) essere una buona idea riportare il seme che è stato usato (se dal riga di comando o qualsiasi altra fonte) per lavorare con i risultati. –

2

si deve inizializzare un seme casuale con

void srand (unsigned int seed); 

Si può prendere per esempio il tempo di sistema.

1

Lo chiamate più di una volta? rand() restituirà sempre la stessa pseudo casuale. Potresti voler chiamare srand() con un bel seme, come l'ora corrente.

4

drand48 è perfetto per l'utilizzo, meglio (float)rand()/RAND_MAX, perché

Le funzioni drand48() e erand48() ritorno non negativo, doppia precisione, i valori in virgola mobile, uniformemente distribuiti nell'intervallo [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; 
} 
Problemi correlati