Le problème est l'ajout. rand()
renvoie une int
valeur de 0...RAND_MAX
. Donc, si vous en ajoutez deux, vous vous lèverez RAND_MAX * 2
. Si cela dépasse INT_MAX
, le résultat de l'addition déborde la plage valide qu'un int
peut contenir. Le débordement des valeurs signées est un comportement indéfini et peut conduire votre clavier à vous parler en langues étrangères.
Comme il n'y a aucun avantage à ajouter deux résultats aléatoires, l'idée simple est simplement de ne pas le faire. Vous pouvez également convertir chaque résultat enunsigned int
avant l'ajout si cela peut contenir la somme. Ou utilisez un type plus grand. Notez que ce long
n'est pas nécessairement plus large que int
, la même chose s'applique à long long
if int
est au moins 64 bits!
Conclusion: Évitez simplement l'ajout. Il ne fournit pas plus de "caractère aléatoire". Si vous avez besoin de plus de bits, vous pouvez concaténer les valeurs sum = a + b * (RAND_MAX + 1)
, mais cela nécessite également probablement un type de données plus grand que int
.
Comme votre raison indiquée est d'éviter un résultat nul: cela ne peut pas être évité en ajoutant les résultats de deux rand()
appels, car les deux peuvent être nuls. Au lieu de cela, vous pouvez simplement incrémenter. Si RAND_MAX == INT_MAX
cela ne peut pas être fait en int
. Cependant, (unsigned int)rand() + 1
fera très, très probablement. Probablement (pas définitivement), car cela nécessite UINT_MAX > INT_MAX
, ce qui est vrai sur toutes les implémentations que je connais (qui couvre plusieurs architectures intégrées, DSP et toutes les plates-formes de bureau, mobiles et serveurs des 30 dernières années).
Avertissement:
Bien que déjà saupoudré dans les commentaires ici, veuillez noter que l'ajout de deux valeurs aléatoires n'obtient pas une distribution uniforme, mais une distribution triangulaire comme lancer deux dés: pour obtenir 12
(deux dés) les deux dés doivent s'afficher 6
. car 11
il existe déjà deux variantes possibles: 6 + 5
ou 5 + 6
, etc.
Donc, l'ajout est également mauvais de cet aspect.
Notez également que les résultats rand()
générés ne sont pas indépendants les uns des autres, car ils sont générés par un générateur de nombres pseudo-aléatoires . Notez également que la norme ne spécifie pas la qualité ou la distribution uniforme des valeurs calculées.
rand()
ne peut pas être négatif ...