El problema es la adición. rand()
devuelve un int
valor de 0...RAND_MAX
. Entonces, si agrega dos de ellos, podrá hacerlo RAND_MAX * 2
. Si eso excede INT_MAX
, el resultado de la suma desborda el rango válido que int
puede contener. El desbordamiento de valores firmados es un comportamiento indefinido y puede hacer que su teclado le hable en lenguas extranjeras.
Como no hay ganancia aquí al agregar dos resultados aleatorios, la idea simple es simplemente no hacerlo. Alternativamente, puede emitir cada resultado unsigned int
antes de la suma si eso puede contener la suma. O use un tipo más grande. Tenga en cuenta que long
no es necesariamente más ancho que int
, ¡lo mismo se aplica a long long
if int
es de al menos 64 bits!
Conclusión: solo evite la adición. No proporciona más "aleatoriedad". Si necesita más bits, puede concatenar los valores sum = a + b * (RAND_MAX + 1)
, pero eso probablemente también requiera un tipo de datos mayor que int
.
Como su razón declarada es evitar un resultado cero: eso no puede evitarse agregando los resultados de dos rand()
llamadas, ya que ambas pueden ser cero. En cambio, puede simplemente incrementar. Si RAND_MAX == INT_MAX
, esto no se puede hacer en int
. Sin embargo, (unsigned int)rand() + 1
lo hará muy, muy probable. Probable (no definitivamente), porque requiere UINT_MAX > INT_MAX
, lo cual es cierto en todas las implementaciones que conozco (que cubren algunas arquitecturas integradas, DSP y todas las plataformas de escritorio, móviles y servidores de los últimos 30 años).
Advertencia:
Aunque ya aparece en los comentarios aquí, tenga en cuenta que agregar dos valores aleatorios no obtiene una distribución uniforme, sino una distribución triangular como lanzar dos dados: para obtener 12
(dos dados) ambos dados tienen que mostrar 6
. porque 11
ya hay dos posibles variantes: 6 + 5
o 5 + 6
, etc.
Entonces, la adición también es mala desde este aspecto.
También tenga en cuenta que los resultados rand()
generados no son independientes entre sí, ya que son generados por un generador de números pseudoaleatorios . Tenga en cuenta también que el estándar no especifica la calidad o la distribución uniforme de los valores calculados.
rand()
no puede ser negativo ...