2010-11-24 15 views
5

Me gustaría hacer números al azar en un rango específico, como "elegir un número aleatorio entre 18 y 35"? ¿Cómo puedo hacer eso con la función rand()?¿Cómo usar la función rand para hacer números en un rango específico?

+0

iv intenté rand% (35-18) +18 y ahora sé que crea un error –

+6

¿Qué idioma estás usando? –

+1

No entiendo lo que estás haciendo con (35-18) +18. ¿No sería eso solo 35? o__O –

Respuesta

6

Si esto está escrito en C, entonces estás muy cerca. Compilar este código:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int i; 
    for (i = 0; i < 1000000; i++) { 
     printf("%d\n", rand()%(35-18+1)+18); 
    } 
} 

y ejecutarlo en una tubería produce esta salida:

[email protected]:~$ gcc -o test test.c 
[email protected]:~$ ./test | sort | uniq -c 
    55470 18 
    55334 19 
    55663 20 
    55463 21 
    55818 22 
    55564 23 
    55322 24 
    55886 25 
    55947 26 
    55554 27 
    55342 28 
    55526 29 
    55719 30 
    55435 31 
    55669 32 
    55818 33 
    55205 34 
    55265 35 

La clave es que se olvidó de añadir 1 - the fencepost error.

Puede generalizar esta en una función:

int random_between(int min, int max) { 
    return rand() % (max - min + 1) + min; 
} 
+4

Esta técnica introduce un sesgo de distribución donde el divisor no es un múltiplo par de MAX_RAND. – NealB

+0

@NealB: Sí, pensé en mencionar eso. Sin embargo, la solución no es trivial, y para los datos de prueba donde la distribución perfecta no es un gran problema, no vale la pena el esfuerzo. – cdhowie

+0

La solución es bastante trivial, ver mi respuesta ... – NealB

-1

asumen rand() le dará un número entre 0 y 1,0

luego use rand() * (35 - 18) + 18 para obtener un número aleatorio entre 18 y 35 años

Edición: se no necesito mod para esto

+1

'rand()' en C devuelve 'int', que no es un tipo de coma flotante. Los documentos para 'rand()' indican que devuelve un número entero entre 0 y 'RAND_MAX', inclusive. – cdhowie

+2

-1 supuesto erróneo –

+0

? Quien te dijo que era C. Java Math.random() da un número aleatorio entre 0 y 1. –

0
  1. ¿Quieres enteros de sólo?
  2. ¿Desea una distribución uniforme?
  3. ¿Desea incluir los valores 18 y 35 como posibles valores?
  4. ¿Qué idioma prefiere usar?

en general, si rand() devuelve un valor flotante en [0.0 ... 1.0) (es decir, es posible obtener valores arbitrariamente cerca de 1.0 pero en realidad no 1) entonces va a querer algo así como

hi = 36 
lo = 18 
res = int((hi-lo)*rand() + lo) # returns random values in 18..35 

tenga en cuenta que esto nunca va a volver realidad el valor hi - por lo tanto tengo incrementa por 1 (es decir, obtendrá todos los valores desde 18 a 35 inclusive, pero nunca 36).

Espero que ayude.

12

Dependiendo del idioma que esté utilizando, el generador de números aleatorios incorporado puede tener esta capacidad - investigue un poco más.

Supongamos que el generador de números aleatorios que siempre tiene devuelve números en un rango determinado. Solo por cuestión de argumento, digamos que el rango es 0..65536 pero quiere números aleatorios en el rango Bajo ... Alto, 18..35 en su ejemplo.

La manera incorrecta de hacerlo sería algo así como:

r = (rand() % (High - Low + 1)) + Low 

rand() devuelve un número en el rango 0..65536. Tome el resto después de dividir por (Alto - Bajo + 1) que en este ejemplo es (35 - 18 + 1 = 18). El resultado es un número entre 0..17. A esto se agrega Low (18) que cambia el resultado, r, dentro del rango 18..35. El rango que está buscando.

Los números generados de esta manera no tienen una distribución uniforme en los casos en que el divisor usó para obtener el resto no es un múltiplo par del límite superior devuelto por función rand(). Vea el Fischer Yates Algorithm - Modulo Bias. Para eliminar este sesgo, necesita calcular el número más grande que es más pequeño que lo que rand() devuelve, pero se divide equitativamente entre (Alto - Bajo + 1). En su caso que es 3640 * 18 = 65520. utilizar esto como un filtro de alta gama en los números devueltos por rand() como sigue:

do forever { 
    r = rand() 
    if r <= 65520 then { 
     r = (r % (High - Low + 1)) + Low 
     break 
     } 
    } 

Ahora los números aleatorios se generan deben tener la misma distribución características como rand().

+2

+1 para las matemáticas correctas. –

Cuestiones relacionadas