Est la valeur de RAND_MAX toujours (2^n)-1?

Je suis intéressé pour le C++, bien que je soupçonne que, tout simplement, les importations C de définition standard. Je crois que la réponse est non pour ce que dit la norme, mais je suis plus intéressé par la pratique de la réponse.

Si RAND_MAX est toujours (2^n)-1, ce qui simplifie le traitement d'une question qui a tourné récemment le déplacement du code de MinGW GCC sous Linux GCC. RAND_MAX semble être plus grand (je n'ai pas vérifier, mais peut-être égale à INT_MAX ou quel que soit le symbole est), de sorte que certains vieux naïvement écrit RAND_MAX-n'est-ce pas-grand-assez-si-travail-autour-c'est le code retournée contre eux. Maintenant j'ai besoin de décider général j'ai besoin de cette bibliothèque, compte tenu de la fiddliness de l'écriture de code qui s'adapte correctement avec la possibilité de dépassement de capacité sans faire d'hypothèses concernant, par exemple, la largeur d'un int.

De toute façon, il y a aucune raisonnablement largement utilisé compilateurs C++ qui utilisent autre chose que (2^n)-1 pour RAND_MAX?

Aussi, ai-je raison que ((RAND_MAX | (RAND_MAX >> 1)) == RAND_MAX) est toujours et seulement vrai si RAND_MAX est égal à ((2^n)-1) pour un certain entier non signé n. Je crois que RAND_MAX est techniquement un int, mais il n'a pas de sens d'avoir un négatif ou de fractions de valeur, donc je pense que je peux remise de ceux-ci. Peu-manipulation ne fonctionne pas normalement me dérange pas, mais je continue à penser que l'expression ne semble pas être bien, et je ne peux pas comprendre pourquoi.

Enfin, bien que je ne vais pas être heureux jusqu'à ce que j'ai une solution de travail de mon propre, ce qui devrait - je utiliser pour les nombres aléatoires plutôt que de l'écrire moi-même? J'ai besoin de nombres aléatoires dans la plage de 0 <= x < paramètre, et surtout je veux qu'-égalité-comme-sainement possible probabilités pour tous les nombres. Par exemple, en prenant (rand() % upperbound) donne un biais en faveur des petites valeurs, en particulier lorsque le upperbound est grande, je veux l'éviter.

Est-il un coup de pouce ou de C++0x chose pour qui?

MODIFIER

Suite à quelque chose dans le "" peu sur le côté de la page montre qu'il existe en effet un moyen d'obtenir des nombres aléatoires avec donné les limites inférieure et supérieure de suralimentation.

OriginalL'auteur Steve314 | 2011-02-09