web-dev-qa-db-fra.com

Comment générer un nombre flottant aléatoire en C

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)
25
fragon

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
49
WhozCraig

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] */
}
9
baz