srand (time (null)) provoque l'avertissement du compilateur: la conversion implicite perd de la précision en nombre entier
Excuses si cette question a déjà été répondu.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand( time(NULL) );
cout << rand();
}
"conversion implicite perd entier précision: 'time_t' (aka "long") à "unsigned int""
Est le message d'erreur Im obtenir lorsque j'exécute le code ci-dessus. J'utilise xcode 4.6.1. Maintenant, quand je utiliser un autre compilateur comme celui de codepad.org il exécute parfaitement bien génératrices de ce qui semble être des nombres aléatoires, donc je suis en supposant que c'est un xcode problème que j'ai besoin de contourner?
Je VIENS de commencer la programmation, donc je suis un débutant complet quand il s'agit de cela. Est-il un problème avec mon code ou est-ce mon compilateur?
Toute aide serait appréciée!
source d'informationauteur user2576878
Vous devez vous connecter pour publier un commentaire.
Vous êtes perdre la précision implicitement parce que
time()
renvoie unelong
qui est plus gros qu'ununsigned int
sur votre cible. Pour contourner ce problème, vous devez convertir explicitement le résultat (donc enlever le "implicite de la perte de précision due"):Étant donné que c'est maintenant 2017, je suis en train de modifier cette question à vous suggérons d'envisager les fonctionnalités fournies par
std::chrono::*
défini dans<chrono>
comme une partie de C++11. Est-ce que votre favori compilateur fournir de C++11? Si non, il devrait vraiment!Pour obtenir l'heure actuelle, vous devez utiliser:
Pourquoi devrais-je me soucier de cela quand
time()
fonctionne?De l'OMI, la seule raison est suffisante: clair, explicite types. Lorsque vous traitez avec des programmes de grande envergure entre assez grand équipes de, savoir si les valeurs passées autour représentent les intervalles de temps ou "absolue" temps, et de quelle ampleur est critique. Avec
std::chrono
vous pouvez concevoir des interfaces et des structures de données qui sont portables et de sauter sur le est-ce-qui-timeout-une-date-ou-millisecondes-de-maintenant-ou-attendre-est-il-secondes blues.Comme mentionné par "nio", une nouvelle solution de contournement serait de taper explicitement exprimés.
Explication plus approfondie:
Le srand() nécessite un unsigned int en paramètre (
srand(unsigned int)
) mais time() renvoie un long int (long int time()
) et ce n'est pas acceptée par le srand() afin de corriger cela, le compilateur doit simplement transtypage (convertir) le "long int" pour "unsigned int".MAIS dans votre cas, le compilateur vous avertit à ce sujet à la place (comme les concepteurs du compilateur pensé que vous devriez être au courant c'est tout).
Ainsi, une simple
srand( (unsigned int) time(NULL) );
fera l'affaire!
(pardonnez-moi si j'ai fait quelque chose de mal, c'est ma première réponse sur stackoverflow)
La fonction srand a unsigned int comme un type d'argument, time_t est de type long. la partie supérieure de 4 octets de long sont supprimés, mais il n'y a pas de problème.
srand sera aléatoire rand algorithme avec 4 baisse des octets de temps, de sorte que vous êtes de fournir plus de données que nécessaire.
si vous obtenez une erreur, essayez simplement de convertir explicitement les time_t type unsigned int:
Une autre chose intéressante est que si vous exécutez votre programme à deux reprises dans la même seconde, vous obtenez le même nombre aléatoire, qui peut parfois être indésirable, c'est parce que si vous les semences de la rand algorithme avec les mêmes données, il va générer le même ordre aléatoire. Ou il peut être souhaitable lorsque vous déboguez un morceau de code et le besoin de tester le même comportement... alors il suffit d'utiliser quelque chose comme
srand(123456)
C'est pas une erreur. Le code est valide et que son sens est bien défini; si un compilateur refuse de le compiler, le compilateur n'est pas conforme à la définition du langage. Plus probable, c'est un avertissementet c'est pour vous dire que le compilateur écrivain pense que vous avez fait une erreur. Si vous insistez sur l'élimination de messages d'avertissement vous pouvez ajouter un plâtre, comme d'autres l'ont suggéré. Je ne suis pas un grand fan de la réécriture valide, valable code, en vue de satisfaire à certaines compilateur écrivain de la notion de bon style; j'ai désactiver l'avertissement. Si vous le faites, cependant, vous pouvez négliger d'autres endroits où une conversion perd les données que vous n'avez pas l'intention.