12
votes

Numéro de flotteur aléatoire

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

Cependant, il retourne toujours 0.563585. Le même nombre, peu importe combien de fois j'ai exécuté mon application de console. P>

EDIT: P>

Voici toute mon application si nécessaire: P>

#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;
}


1 commentaires

Notez que la fonction RAND () ne doit pas nécessairement être un générateur de nombres aléatoires très «bon». Cela n'aura probablement pas d'importance si vous n'avez besoin que de deux décimales entre 0 et 1; Ce serait si vous aviez besoin de 4 décimales ou plus. Si vous avez besoin de plus d'endroits, regardez le drand48 () famille de fonctions: opengroup.org/onlinepubs/9699919799/fonctions/drand48.html


5 Réponses :


13
votes

Vous devez appeler xxx

avant d'utiliser rand pour la première fois. heure est dans .

EDIT: Comme le souligne Jonathan Leffler, cela est facilement prédit, alors n'essayez pas d'utiliser pour cryprographie.


1 commentaires

Soyez prudent avec l'utilisation du temps (); Il est assez facilement prévisible et vos séquences aléatoires peuvent donc être prédites aussi. Cela peut ne pas avoir d'importance dans ce cas, mais faites attention en général.



10
votes

c'est-à-dire parce que le générateur aléatoire C est un pseudo -random générateur (et c'est, BTW, une très bonne chose, avec de nombreuses applications). (La norme ANSI C nécessite un tel générateur pseudo-aléatoire)

Essentiellement, chaque fois que votre demande de console est rétablie utilise la même graine [par défaut] pour le générateur aléatoire . .

En ajoutant une ligne comme xxx

Vous obtiendrez une graine distincte à chaque fois, et la séquence de nombre produit en conséquence en conséquence.
NOTE : Il vous suffit d'appeler SRAND () une fois avant chaque fois que vous appelez Rand ().

EDIT : Time Inc.)
[D'une remarque d'Artelius] À des fins de test, il est préférable de srand (quelque_const) et de modifier la valeur de la constante entre les courses. De cette façon, si un insecte se manifeste en raison d'une combinaison de nombres aléatoires, vous serez capable de le reproduire.


3 commentaires

À des fins de test, il est préférable de srand (quelque_const) et de modifier la valeur de la constante entre les courses. De cette façon, si un insecte se manifeste en raison d'une combinaison de nombres aléatoires, vous serez capable de le reproduire.


@artelius, excellente suggestion. J'ai ajouté cela comme une note à la réponse elle-même!


@Artelius et MJV: C'est est un bon point; Il peut également être une bonne idée de permettre à l'utilisateur de spécifier la graine sur la ligne de commande au lieu d'utiliser le temps (), et il peut souvent (mais pas toujours) être une bonne idée de signaler la graine utilisée (que ce soit de ligne de commande ou toute autre source) pour travailler avec les résultats.



2
votes

Vous devez initialiser une graine aléatoire avec xxx

vous pouvez prendre par exemple le temps système.


0 commentaires

1
votes

l'appelez-vous plus d'une fois? Rand () retournera toujours le même pseudo aléatoire. Vous voudrez peut-être appeler Srand () avec une belle graine, comme l'heure actuelle.


0 commentaires

6
votes

Drand48 est parfait pour votre usage, mieux que (flotteur ) rand () / rand_max , parce que

the drand48 () et erand48 () Les fonctions renvoient des valeurs non négatives, de la double précision, des virgules flottants, uniformément réparties sur l'intervalle [0.0, 1.0] . xxx


0 commentaires