2011-03-13 8 views
24

Je sais que c'est une question plutôt simple, mais je ne suis pas très bon en maths.Générer un flottant aléatoire entre deux flotteurs

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

float random = ((float) rand())/(float) RAND_MAX; 
  • Mais que, si je veux une fonction qui donne une gamme de deux flotteurs, retourne un flotteur pseudo-aléatoire dans cette plage?

Exemple:

RandomFloat(0.78, 4.5); //Could return 2.4124, 0.99, 4.1, etc. 
+2

En outre, si vous pouvez, préférez doubler au cours flottant. –

+1

duplication possible de [flottant aléatoire C++] (http://stackoverflow.com/questions/686353/c-random-float) –

Répondre

24
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 retour a, plus quelque chose, où quelque chose est entre 0 et b-a qui fait entre a et b le résultat final mensonge.

+0

@stefan Nope, vous n'avez pas. Si vous ajoutez le 'fabsf', alors vous devez aussi changer la dernière ligne' min (a, b) + r'. – Wim

+2

La façon dont il est écrit maintenant, si 'b Wim

+0

Vous avez raison, c'est juste déroutant que 1.0 fera la plus petite valeur;) – stefan

4
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 
} 
+0

@stefan, oui vous avez raison. J'ai manqué comment le hasard a été calculé et l'escaladant de 0-RAND_MAX vers le bas. On dirait que j'avais besoin de l'agrandir. –

0

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;  
} 
+1

'-1' car, étant donné que la bibliothèque standard C++ a une meilleure génération pseudo-aléatoire, cette réponse n'ajoute rien de précieux. –

1

On suppose que, vous avez MIN_RAND et MAX_RAND définir les plages, alors vous pouvez avoir ce qui suit:

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 de votre plage préférée. MIN_RAND, MAX_RAND peut être une valeur, comme, disons, 2,5, 6,6 Ainsi, la fonction pourrait être aussi:

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

Utilisez plutôt des générateurs aléatoires C++ 11. –

Questions connexes