Pregunta

he escrito esta función para obtener un flotador pseudo-aleatorio entre 0 .. 1, ambos inclusive:

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

Sin embargo, siempre está volviendo 0.563585. El mismo número no importa cuántas veces me paso la aplicación de consola.

EDIT:

Aquí está 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;
}
¿Fue útil?

Solución

Es necesario llamar

srand(time(NULL));

Antes de utilizar rand por primera vez. time está en <time.h>.

EDIT:. Como Jonathan Leffler señala, esto es fácil de predecir, así que no intente usarlo para cryprography

Otros consejos

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

En esencia cada vez que su aplicación de consola se reinicia que utiliza el mismo [por defecto] semilla para el generador aleatorio .

mediante la adición de 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: : sólo tiene que llamar a srand () una vez, no antes de que cada vez que llame rand ()

.

Editar : (prueba / depuración en tiempo pista)
[A partir 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 las corridas. De esta manera si un error se manifiesta debido a una combinación de números aleatorios, usted será capaz de reproducirla.

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

  

Las funciones drand48() y erand48() devuelven valores no negativos, de doble precisión, 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;
}

Usted tiene que inicializar una semilla aleatoria con

void srand ( unsigned int seed );

Puede tomar por ejemplo la hora del sistema.

¿Usted llama más de una vez? rand () siempre devolverá la misma seudo aleatoria. Es posible que desee llamar a srand () con un poco de semilla agradable, como la hora actual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top