O problema é a adição. rand()retorna um intvalor de 0...RAND_MAX. Então, se você adicionar dois deles, você fará o que quiser RAND_MAX * 2. Se isso exceder INT_MAX, o resultado da adição excederá o intervalo válido que intpode ser mantido. O excesso de valores assinados é um comportamento indefinido e pode levar o teclado a falar com você em línguas estrangeiras.
Como não há ganho aqui em adicionar dois resultados aleatórios, a idéia simples é simplesmente não fazê-lo. Como alternativa, você pode converter cada resultado unsigned intantes da adição, se isso puder conter a soma. Ou use um tipo maior. Observe que longnão é necessariamente maior que int, o mesmo se aplica a long longse inttiver pelo menos 64 bits!
Conclusão: Apenas evite a adição. Não fornece mais "aleatoriedade". Se você precisar de mais bits, poderá concatenar os valores sum = a + b * (RAND_MAX + 1), mas isso provavelmente também requer um tipo de dados maior que int.
Como o motivo declarado é evitar um resultado zero: isso não pode ser evitado adicionando os resultados de duas rand()chamadas, pois ambas podem ser zero. Em vez disso, você pode apenas incrementar. Se RAND_MAX == INT_MAX, isso não pode ser feito em int. No entanto, (unsigned int)rand() + 1fará muito, muito provavelmente. Provavelmente (não definitivamente), porque exige UINT_MAX > INT_MAX, o que é verdade em todas as implementações que eu conheço (que abrange várias arquiteturas incorporadas, DSPs e todas as plataformas de desktop, dispositivos móveis e servidores dos últimos 30 anos).
Aviso:
Embora já tenha sido polvilhado nos comentários aqui, observe que a adição de dois valores aleatórios não obtém uma distribuição uniforme, mas uma distribuição triangular como rolar dois dados: para obter 12(dois dados), ambos os dados precisam ser mostrados 6. pois 11já existem duas variantes possíveis: 6 + 5ou 5 + 6, etc.
Portanto, a adição também é ruim nesse aspecto.
Observe também que os resultados rand()gerados não são independentes um do outro, pois são gerados por um gerador de números pseudo - aleatórios . Observe também que o padrão não especifica a qualidade ou a distribuição uniforme dos valores calculados.
rand()não pode ser negativo ...