Aléatoire de nombre à virgule
J'ai écrit cette fonction pour obtenir un pseudo-aléatoire flotter entre 0 .. 1 inclus:
float randomFloat()
{
float r = (float)rand()/(float)RAND_MAX;
return r;
}
Cependant, il est toujours de retour 0.563585. Le même nombre peu importe combien de fois je lance mon application console.
EDIT:
Voici mon ensemble de l'application, 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;
}
Notez que la fonction rand() n'a pas besoin d'être une très "bonne" générateur de nombre aléatoire. Il ne sera probablement pas d'importance si vous avez seulement besoin de deux décimales après la virgule entre 0 et 1; il serait si vous avez besoin de 4 ou plus de décimales. Si vous avez besoin de plus de places, regardez la
drand48()
famille de fonctions: opengroup.org/onlinepubs/9699919799/functions/drand48.htmlOriginalL'auteur Richard Knop | 2009-11-07
Vous devez vous connecter pour publier un commentaire.
Vous devez appeler
avant d'utiliser
rand
pour la première fois.time
est dans<time.h>
.EDIT: Comme Jonathan Leffler points, c'est facile à prévoir, donc, ne pas essayer de l'utiliser pour cryprography.
OriginalL'auteur rlbond
C'est parce que l'aléatoire en C-générateur est un pseudo-générateur aléatoire (et qui est, d'ailleurs, une très bonne chose, avec de nombreuses applications). (Le C ANSI standard nécessite un générateur pseudo-aléatoire)
Essentiellement à chaque fois que votre application console est re-commencé il utilise le même [par défaut] de la graine pour le générateur aléatoire.
en ajoutant une ligne comme
vous obtiendrez une graine distincte à chaque fois, et la séquence de numéro de produit varient en conséquence.
Note: vous avez seulement besoin d'appeler srand() une fois, pas avant, à chaque appel à rand().
Modifier: (Test/Debug-temps de l'indice)
[à partir d'une remarque de Artelius]
Pour des fins de test, il est préférable de srand(SOME_CONST), et modifier la valeur de la constante entre les pistes. 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.
excellente suggestion. J'ai ajouté ce qu'une note de la réponse elle-même!
et mjv: est un bon point; il peut aussi être une bonne idée pour permettre à l'utilisateur de spécifier la valeur de départ sur la ligne de commande au lieu d'utiliser time(), et il peut souvent (mais pas toujours) être une bonne idée de rapporter la graine qui a été utilisé (que ce soit à partir de la ligne de commande ou de toute autre source) pour travailler avec les résultats.
OriginalL'auteur mjv
drand48 est parfait pour votre utilisation, mieux que
(float)rand()/RAND_MAX
, parce queOriginalL'auteur ephemient
Vous devez les initialiser une valeur aléatoire avec
Vous pouvez prendre pour exemple l'heure du système.
OriginalL'auteur Lucas
Appelez-vous cela plus d'une fois? rand() retournera toujours le même pseudo aléatoire. Vous voudrez peut-être appeler srand() avec quelques belles graines, comme à l'heure actuelle.
OriginalL'auteur Richard Pennington