Je ne trouve pas de solution pour trouver le nombre flottant aléatoire à partir du [0,a]
, où a
est un flottant défini par l'utilisateur.
J'ai essayé ce qui suit, mais cela ne semble pas fonctionner correctement.
float x=(float)Rand()/((float)Rand_MAX/a)
Essayer:
float x = (float)Rand()/(float)(Rand_MAX/a);
Pour comprendre comment cela fonctionne, tenez compte des éléments suivants.
N = a random value in [0..Rand_MAX] inclusively.
L'équation ci-dessus (en supprimant les moulages pour plus de clarté) devient:
N/(Rand_MAX/a)
Mais la division par une fraction équivaut à la multiplication par l'inverse de cette fraction, donc cela équivaut à:
N * (a/Rand_MAX)
qui peut être réécrit comme:
a * (N/Rand_MAX)
Considérant N/Rand_MAX
est toujours une valeur à virgule flottante comprise entre 0,0 et 1,0, cela générera une valeur entre 0,0 et a
.
Alternativement, vous pouvez utiliser ce qui suit, ce qui fait efficacement la ventilation que j'ai montrée ci-dessus. En fait, je préfère cela simplement parce que c'est plus clair ce qui se passe réellement (pour moi, de toute façon):
float x = ((float)Rand()/(float)(Rand_MAX)) * a;
Remarque: la représentation en virgule flottante de a
doit être exacte ou cela n'atteindra jamais votre cas Edge absolu de a
(il se rapprochera). Voir cet article pour les détails sur pourquoi.
Échantillon
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand((unsigned int)time(NULL));
float a = 5.0;
for (int i=0;i<20;i++)
printf("%f\n", ((float)Rand()/(float)(Rand_MAX)) * a);
return 0;
}
Sortie
1.625741
3.832026
4.853078
0.687247
0.568085
2.810053
3.561830
3.674827
2.814782
3.047727
3.154944
0.141873
4.464814
0.124696
0.766487
2.349450
2.201889
2.148071
2.624953
2.578719
Vous pouvez également générer dans une plage [min, max] avec quelque chose comme
float float_Rand( float min, float max )
{
float scale = Rand() / (float) Rand_MAX; /* [0, 1.0] */
return min + scale * ( max - min ); /* [min, max] */
}