web-dev-qa-db-fra.com

Générer un flottant aléatoire entre deux flotteurs

Je sais que la question est assez simple, mais je ne suis pas très bon en maths.

Je sais comment générer un float aléatoire entre 0 et 1:

float random = ((float) Rand()) / (float) Rand_MAX;
  • Mais quoi, si je veux une fonction qui donne une plage de deux flottants, renvoie un flottant pseudo-aléatoire dans cette plage?

Exemple:

RandomFloat( 0.78, 4.5 ); //Could return 2.4124, 0.99, 4.1, etc.
26
Maks
float RandomFloat(float a, float b) {
    float random = ((float) Rand()) / (float) Rand_MAX;
    float diff = b - a;
    float r = random * diff;
    return a + r;
}

Cela fonctionne en retournant a plus quelque chose , où quelque chose est compris entre 0 et b-a, ce qui fait que le résultat final se situe entre a et b.

28
Wim
float RandomFloat(float min, float max)
{
    // this  function assumes max > min, you may want 
    // more robust error checking for a non-debug build
    assert(max > min); 
    float random = ((float) Rand()) / (float) Rand_MAX;

    // generate (in your case) a float between 0 and (4.5-.78)
    // then add .78, giving you a float between .78 and 4.5
    float range = max - min;  
    return (random*range) + min;
}
4
Doug T.

Supposons que vous avez MIN_Rand et MAX_Rand définissant les plages, alors vous pouvez avoir les éléments suivants:

const float MIN_Rand = 2.0, MAX_Rand = 6.0;
const float range = MAX_Rand - MIN_Rand;
float random = range * ((((float) Rand()) / (float) Rand_MAX)) + MIN_Rand ;

Cela vous fournira le nombre mis à l'échelle à votre gamme préférée . MIN_Rand, MAX_Rand peut être n'importe quelle valeur, comme par exemple 2,5, 6,6 Donc, la fonction pourrait être:

float RandomFloat(float min, float max) {
    return  (max - min) * ((((float) Rand()) / (float) Rand_MAX)) + min ;
}
1

Aléatoire entre 2 float:

float    random_between_two_int(float min, float max)    
{    
    return (min + 1) + (((float) Rand()) / (float) Rand_MAX) * (max - (min + 1));    
}

Aléatoire entre 2 int:

int    random_between_two_int(float min, float max)    
{    
    return Rand() % (max - min) + min + 1;     
}
0
Benjamin