qrand n'est pas de la génération d'un nombre aléatoire
J'ai un QT application, l'exécution de 2 à plus de threads.
À l'intérieur les fils je utiliser le qrand fonction pour générer un nombre aléatoire. Le code suivant est utilisé pour obtenir le nombre, où m_fluctuations max est un double.
int fluctuate = qrand() % (int)(m_FluctuationMax * 100);
J'ai essayé d'ajouter le code suivant dans le thread principal, et aussi à l'intérieur du fil classes.
QTime now = QTime::currentTime();
qsrand(now.msec());
Maintenant, le problème, c'est que les valeurs générées sont toujours les mêmes, chaque fois que l'application est démarrée.
Ne devraient-ils pas être différente, car la graine est défini par " currentTime()'.
Grâce
OriginalL'auteur Michael Frey | 2010-06-29
Vous devez vous connecter pour publier un commentaire.
J'ai eu mon qsrand() dans le fil/le constructeur de la classe. Quand je l'ai déplacé à la fonction run (), il a commencé à travailler de façon aléatoire. Je ne sais pas pourquoi cela ne fonctionnerait pas du constructeur. Merci à tous pour votre aide.
qsrand()
magasins de la graine dans le thread local storage (indépendant de valeurs pour chaque thread). Lors de la mise à l'appel dans le constructeur, la graine est initialisé dans un thread et utilisé dans un autre. Lorsque vous mettez le à l'appel dans larun()
méthode, la graine est initialisé dans le même thread qui appelleqrand()
.OriginalL'auteur Michael Frey
Cela peut aider toute personne qui est arrivé d'avoir un problème similaire:
OriginalL'auteur Tyler Heers
qsrand()
utilisations fil-local de stockage pour stocker la semence qui est en fait l'état du générateur de nombres pseudo-aléatoires qui obtient aussi mis à jour à chaque appel àqrand()
. Si vous déclencher le PRNG en dehors du thread où vous allez l'utiliser, ce que les graines ne pas influer sur le résultat. Fil-local de stockage en général par défaut à zéro, de sorte que vous obtenez le même séquence de pseudorandoms à chaque fois parce que la semence est toujours le même.OriginalL'auteur laalto
La première chose que je serais la vérification de la valeur de l'
now.msec()
. Elle renvoie uniquement l'ordre de la milliseconde partie de l'heure et de la doco états:Il se peut que votre plate-forme renvoie toujours la même valeur pour
msec()
. Si c'est le cas, vous pouvez essayer d'utiliser les minutes et les secondes combiné d'une certaine manière (en supposant que vous n'êtes pas en cours d'exécution de votre code plusieurs fois par seconde).Vous n'avez pas déclaré la plateforme que vous utilisez, mais le code source de Qt prend uniquement en charge les sous-deuxième résolution si
Q_OS_WIN
ouQ_OS_UNIX
est réglé.Gardez à l'esprit que les nombres aléatoires sont par thread alors vous devriez probablement faire de la
qsrand
dans chaque fil, de peur qu'il soit automatiquement ensemencés avec 1.est le sur le même chaque fois que vous appelez
qrand()
ou est le ordre sur le même (avec des numéros différents de chaqueqrand()
appel) sur chaque programme exécuté?Aussi ce qui est m_Fluctuation_Max ensemble? Et, si vous êtes toujours obtenir le même nombre, c'est quoi?
La séquence est la même à chaque fois que l'application est exécutée. J'ai trouvé la solution. Vérifiez la réponse ci-dessous.
OriginalL'auteur paxdiablo