Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lucas59 en 30 Septiembre 2014, 15:16 pm



Título: Como generar numeros aleatorios pares?
Publicado por: lucas59 en 30 Septiembre 2014, 15:16 pm
Hola gente como genero numero aleatorios pares ? con un rand


Título: Re: Como generar numeros aleatorios pares?
Publicado por: kutcher en 30 Septiembre 2014, 15:34 pm
Solo es cuestión de generar un rango de números aleatorios especificos y multiplicar los siguientes por dos ya que todo entero multiplicado por dos siempre sera un número par :

Código
  1. 2 * ((rand() % 25) + 1)


Esto genera pares aleatorios entre 1 y 50

Saludos kutcher


Título: Re: Como generar numeros aleatorios pares?
Publicado por: eferion en 30 Septiembre 2014, 16:37 pm
Y si no te apetece tener que hacer cálculos en plan... necesito obtener pares de 0 a 50, por lo que tengo que reducir el rango de "rand" a 25... puedes simplemente poner a '0' el bit de menor peso del número obtenido:

Código
  1. int numero = ( rand( ) % 51) & 0xFFFFFFFE;

Esta versión te devuelve siempre un número par dentro del rango [0,50]. Como el número 0xFF... es un poco feo, puedes hacer uso de la librería limits.h para dejarlo un poco más correcto:

Código
  1. int numero = ( rand( ) % 51 ) & ( UINT_MAX - 1 )

En este caso, UNIT_MAX contiene el número más alto que se puede almacenar en un 'unsigned int'... dado que el 'unsigned int' ocupa exactamente lo mismo que un 'int' y, además, 'unsigned int' no necesita bit de signo, UINT_MAX es equivalente (en 32 bits) a 0xFFFFFFFF... si a ese número le restamos uno ya tenemos una máscara que es capaz de eliminar el bit que hace que los números sean impares.


Título: Re: Como generar numeros aleatorios pares?
Publicado por: rir3760 en 1 Octubre 2014, 17:31 pm
Si se quiere desactivar el bit menos significativo otra opción es obtener la mascara mediante el operador de complemento a uno con la ventaja de no necesitar la inclusión de <limits.h>:
Código
  1. num = rand() % 51 & ~1;

Un saludo


Título: Re: Como generar numeros aleatorios pares?
Publicado por: Shout en 1 Octubre 2014, 18:12 pm
Si se quiere desactivar el bit menos significativo otra opción es obtener la mascara mediante el operador de complemento a uno con la ventaja de no necesitar la inclusión de <limits.h>:
Código
  1. num = rand() % 51 & ~1;

Un saludo
Para los que no entienden el "~1":
Dado el hecho de que ~ invierte los bits (es la función inversa o complementaria en matemáticas) así:
~1001 pasa a ser 0110, ~1111 pasa a ser 0000, etc.

Entonces, sabiendo que "1" se representa así en binario:
0000 0000 | 0000 0000 | 0000 0000 | 0000 0001
(he separado los bits para que se lean fácilmente)
Su complemento es:
1111 1111 | 1111 1111 | 1111 1111 | 1111 1110

Entonces, [cualquier número] AND [máscara] es:
1101001010011011001101110001101
AND
1111111111111111111111111111110
----------------------------------------------------
1101001010011011001101110001100

Eliminando así el bit menos significativo, y haciendo que el número sea par.