O problema é a adição. rand()
retorna um int
valor 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 int
pode 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 int
antes da adição, se isso puder conter a soma. Ou use um tipo maior. Observe que long
não é necessariamente maior que int
, o mesmo se aplica a long long
se int
tiver 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() + 1
fará 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 11
já existem duas variantes possíveis: 6 + 5
ou 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 ...