2011-03-13 9 views
24

Sé que esta es una pregunta bastante simple, pero no soy muy bueno en matemáticas.Generar flotación aleatoria entre dos carrozas

sé cómo generar un flotador aleatorio entre 0 y 1:

float random = ((float) rand())/(float) RAND_MAX; 
  • Pero qué, si quiero una función que da un rango de dos flotadores, devuelve un flotador pseudoaleatorio en ese rango?

Ejemplo:

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

Además, si se puede, prefieren doble sobre el flotador. –

+1

posible duplicado de [Flotación aleatoria de C++] (http://stackoverflow.com/questions/686353/c-random-float) –

Respuesta

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

Esto funciona mediante la devolución de a más algo, en donde algo está entre 0 y b-a que hace que el resultado final se encuentran en entre a y b.

+0

@stefan No, no es así. Si agrega el 'fabsf', entonces necesita cambiar la última línea también a' min (a, b) + r'. – Wim

+2

La forma en que está escrito ahora, si 'b Wim

+0

Tiene razón, es confuso que 1.0 obtenga el valor más bajo;) – 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, sí, estás en lo cierto. Me olvidé de cómo se calculó el azar y lo estaba escalando desde 0-RAND_MAX hacia abajo. Parece que necesitaba escalarlo nuevamente. –

0

aleatoria entre el 2 de flotación:

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

aleatorio entre 2 int:

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

'-1' porque teniendo en cuenta que la biblioteca estándar C++ tiene una mejor generación pseudoaleatoria, esta respuesta no agrega nada valioso. –

1

Supongamos, usted tiene MIN_RAND y MAX_RAND definir los rangos, entonces puede tener el siguiente:

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 ; 

Esto le proporcionará el número adaptado a su rango preferido. MIN_RAND, MAX_RAND puede ser cualquier valor, como decir 2,5, 6,6 Por lo tanto, la función podría ser como:

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

Use generadores aleatorios C++ 11 en su lugar. –

Cuestiones relacionadas