¿Cómo usar la función rand para hacer números en un rango específico?

Me gustaría hacer números aleatorios 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() ?

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

 #include  #include  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:

 chris@zack:~$ gcc -o test test.c chris@zack:~$ ./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 olvidaste agregar 1 - el error del poste de la cerca .

Puedes generalizar esto en una función:

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

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 el argumento, digamos que el rango es 0..65536 pero quieres números aleatorios en el rango Bajo … Alto, 18..35 en tu ejemplo.

La forma 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 rest 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ás buscando.

Los números generados de esta manera no tienen una distribución uniforme en los casos en que el divisor utilizado para obtener el rest no es un múltiplo par del límite superior devuelto por la función rand (). Ver el algoritmo Fischer Yates – 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, es 3640 * 18 = 65520. Use esto como un filtro de rango alto en los números devueltos por rand () de la siguiente manera:

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

Ahora los números aleatorios que genera deben tener las mismas características de distribución que rand ().

  1. ¿Quieres enteros solo?
  2. ¿Quieres una distribución uniforme?
  3. ¿Desea incluir valores 18 y 35 como posibles valores?
  4. ¿Qué idioma preferirías usar?

en general, si rand () devuelve un valor flotante en [0.0 … 1.0) (es decir, puede obtener valores arbitrariamente cercanos a 1.0 pero no en realidad 1) entonces querrá 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 devolverá realmente el valor hi, por lo tanto, lo he incrementado en 1 (es decir, obtendrá todos los valores de 18 a 35 inclusive, pero nunca 36).

Espero que ayude.

supongamos que rand () te da un número entre 0 y 1.0

luego use rand () * (35 – 18) + 18 para obtener un número aleatorio entre 18 y 35.

Editar: no necesitas mod para esto.