Como generar numeros aleatorios pares?

Iniciado por lucas59, 30 Septiembre 2014, 15:16 PM

0 Miembros y 1 Visitante están viendo este tema.

lucas59

Hola gente como genero numero aleatorios pares ? con un rand

kutcher

#1
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 (cpp) [Seleccionar]
2 * ((rand() % 25) + 1)

Esto genera pares aleatorios entre 1 y 50

Saludos kutcher

eferion

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:

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:

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.

rir3760

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>:
num = rand() % 51 & ~1;

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Shout

Cita de: 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>:
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.
I'll bring you death and pestilence, I'll bring you down on my own