2009-11-07 10 views
10

escribí esta función para obtener un flotador pseudo-aleatorio entre 0 .. 1, ambos inclusive:flotador aleatoria número

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

Sin embargo, siempre se vuelve 0.563585. El mismo número sin importar cuántas veces ejecute mi aplicación de consola.

EDIT:

Aquí es toda mi aplicación si es necesario:

#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

Tenga en cuenta que la función rand() no tiene por qué ser un generador de números muy 'bueno' al azar. Probablemente no importe si solo necesitas dos decimales entre 0 y 1; lo haría si necesitaras 4 o más decimales. Si necesita más lugares, consulte la familia de funciones 'drand48()': http://www.opengroup.org/onlinepubs/9699919799/functions/drand48.html –

Respuesta

13

es necesario llamar a

srand(time(NULL)); 

antes de usar rand por primera vez. time está en <time.h>.

EDITAR: Como señala Jonathan Leffler, esto es fácil de predecir, así que no intentes usarlo para criptografía.

+2

Tenga cuidado al usar time(); es bastante fácil de predecir y, por lo tanto, sus secuencias aleatorias también pueden predecirse. Puede que no importe en este caso, pero tenga cuidado en general. –

10

Eso se debe a que el azar -C es un generador seudo generador -RANDOM (y que es, por cierto, una cosa muy buena, con muchas aplicaciones). (El estándar ANSI C requiere un generador pseudoaleatorio de este tipo)

Esencialmente, cada vez que se reinicia su aplicación de consola, usa la misma semilla [predeterminada] para el generador aleatorio.

añadiendo una línea como

srand(time(NULL)); 

obtendrá una semilla distinta cada vez, y la secuencia de la serie producida con variará en consecuencia.
Nota: solo necesita llamar a srand() una vez, no antes cada vez que llame a rand().

Editar: (Test/tiempo de depuración pista)
[de una observación de Artelius] Para propósitos de prueba, lo mejor es srand (SOME_CONST), y cambiar el valor de la constante entre carreras. De esta forma, si un error se manifiesta debido a una combinación de números aleatorios, podrá reproducirlo.

+5

Para fines de prueba, es mejor hacer srand (SOME_CONST) y cambiar el valor de la constante entre ejecuciones. De esta forma, si un error se manifiesta debido a una combinación de números aleatorios, podrá reproducirlo. – Artelius

+0

@artelius, excelente sugerencia. ¡Agregué esto como una nota a la respuesta misma! – mjv

+0

@artelius y mjv: es un buen punto; también puede ser una buena idea permitir que el usuario especifique la semilla en la línea de comando en lugar de usar el tiempo(), y con frecuencia (aunque no siempre) es una buena idea informar la semilla que se usó (ya sea desde el línea de comando o cualquier otra fuente) para trabajar con los resultados. –

2

debe inicializar una semilla aleatoria con

void srand (unsigned int seed); 

Usted puede tomar, por ejemplo, la hora del sistema.

1

¿Lo llamas más de una vez? rand() siempre devolverá el mismo pseudoaleatorio. Es posible que desee llamar a srand() con una buena semilla, como la hora actual.

4

drand48 es perfecto para su uso, mejor que (float)rand()/RAND_MAX, porque

Los drand48() y erand48() funciones devuelven no negativo, de doble precisión, los valores de punto flotante, distribuidos de manera uniforme en el intervalo [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; 
}