Question

J'ai écrit cette fonction pour obtenir un pseudo flottant aléatoire entre 0 .. 1 inclus:

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

Cependant, il retourne toujours 0,563585. Le même nombre, peu importe combien de fois je lance mon application console.

EDIT:

Voici mon application entière si nécessaire:

#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;
}
Était-ce utile?

La solution

Vous devez appeler

srand(time(NULL));

avant d'utiliser rand pour la première fois. time est <time.h>.

EDIT:. Comme Jonathan Leffler souligne, cela est difficile à prévoir, donc ne pas essayer de l'utiliser pour cryprography

Autres conseils

C'est parce que le générateur aléatoire C est un pseudo générateur -Random (et qui est, d'ailleurs, une très bonne chose, avec de nombreuses applications). (La norme ANSI C nécessite un tel générateur pseudo-aléatoire)

Pour l'essentiel à chaque fois que l'application de la console est de nouveau commencé utilise le même [par défaut] graines pour le générateur aléatoire .

en ajoutant une ligne comme

  srand(time(NULL));

vous obtiendrez une graine distincte à chaque fois, et la séquence du nombre produit avec varier en conséquence.
Remarque : il vous suffit d'appeler srand () une fois, pas avant chaque fois que vous appelez rand ()

.

Modifier : (Test / indice temps de débogage)
[À partir d'une remarque de Artelius] Pour fins de test, il est préférable de srand (SOME_CONST), et modifier la valeur de la constante entre les courses. De cette façon, si un bug se manifeste en raison d'une combinaison de nombres aléatoires, vous serez en mesure de le reproduire.

drand48 est parfait pour votre usage, mieux que (float)rand()/RAND_MAX, parce que

  

Les drand48() et les fonctions erand48() retour non-négatif, en double précision, les valeurs à virgule flottante, réparties uniformément sur l'intervalle [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;
}

Vous devez initialiser une graine aléatoire avec

void srand ( unsigned int seed );

Vous pouvez par exemple le temps du système.

Avez-vous l'appelez plus d'une fois? rand () retourne toujours le même pseudo-aléatoire. Vous pouvez appeler srand () avec quelques graines bien, comme l'heure actuelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top