nombre flottant au hasard
-
18-09-2019 - |
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;
}
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 fonctionserand48()
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.