L'amélioration de la qualité de la génération de nombre aléatoire dans l'intervalle Qt 5.3
Je suis actuellement à la mise en œuvre d'un générateur de nombre aléatoire dans Qt5.3 dans le cadre de l'algorithme génétique des expériences. J'ai essayé plusieurs méthodes mais la meilleure semble être:
//Seed the random generator with current time
QTime time = QTime::currentTime();
qsrand((uint)time.msec());
Et puis cette fonction pour générer les nombres aléatoires:
int MainWindow::getRandomNo(int low, int high)
{
return qrand() % ((high + 1) - low) + low;
}
En raison de la nature de ces expériences, la nature aléatoire de ces nombres est important. Est-il un moyen d'améliorer la qualité de l'aléatoire nombre d'échantillons? Après l'analyse statistique, l'intervalle Qt générateur de nombre aléatoire typiques de modèles que l'on trouve dans les anciens systèmes de génération de nombre aléatoire.
La méthode utilisée ci-dessus repose sur l'heure actuelle comme une graine pour le générateur de nombre. Est-il un moyen pour améliorer les semences de sorte que les séquences aléatoires sont moins sujettes à des schémas? Je vous serais extrêmement reconnaissant pour toute aide.
- Aucune raison de ne pas utiliser
<random>
? Il est beaucoup plus robuste. - Il semble souffrir de la même motif de questions - presque prévisible étant donné un échantillon suffisamment grand de taille.
- Chaque GÉNÉRATEUR est prévisible, avec un "assez grand" la taille de l'échantillon. Mais "assez grand" est loin d'être possible avec de bons algorithmes. Avez-vous regarder encore disponibles? cplusplus.com/reference/random
- Cette application est une simulation de l'évolution des processus et en tant que telle sera plus efficace, la plus aléatoire l'entrée. Les générateurs de nombres aléatoires que vous avez mentionnés sont fantastiques, mais c'est le problème, ils sont trop bon. Les séquences aléatoires générés sont tous beaucoup trop étendre uniformément pour être d'une quelconque utilité. Ce qui est nécessaire est un système qui permet de générer une véritable séquence aléatoire. La seule chose qui est même venu près d'un matériel générateur de nombre aléatoire. Jusqu'à présent, le meilleur que j'ai trouvé est l'intervalle Qt dans ma question, à l'aide de l'horloge comme une graine.
- Il n'y a pas une telle chose comme un générateur de nombres aléatoires qui est "trop bon". Mersenne Twister sera de vous fournir n'importe quelle séquence de nombres avec (presque) la même probabilité. Même une séquence telle que 0 - 0 - 0 - 0 - 0
- trop uniformément répartie" est une propriété de la "vraie séquence aléatoire". Ou pensez-vous que "la vraie séquence aléatoire" doit avoir un certain modèle en elle?
- Je soupçonne que vous avez besoin d'une distribution non uniforme, ce qui est également fourni par
<random>
. - Merci beaucoup pour toutes les réponses. Je comprends la confusion sur ce que je demande, c'est difficile de transmettre le problème exact sans quelques connaissances de base des Gaz!
Vous devez vous connecter pour publier un commentaire.
Utilisation MT.
Vous pouvez obtenir une mise en œuvre ici:
J'ai rencontré le même problème il y a des années dans un logiciel delphi, et de passer à MT sovled mon problème. Mais vérifier la liste dans l'élan docu pour de plus amples informations sur les différences entre RNG algorithmes.
<random>
. Vous n'avez pas besoin d'une bibliothèque.Réglage de votre semence ne sera pas vraiment effet de la qualité des chiffres généré, il suffit de l'ordre particulier des nombres générés. Vous aurez besoin d'utiliser un meilleur algorithme pour générer vos nombres aléatoires.
En outre, la façon dont vous utilisez les nombres générés est légèrement biaisée. Avec votre getRandomNo fonction, il y aura un léger biais en faveur des petits nombres. Par exemple, si
qrand
retourne une valeur dans l'intervalle0..2^32-1
, et vous avezlow=0
ethigh=2^32-2
, puis à l'aide%
comme vous le faites, signifie que0
sera renvoyé (environ) deux fois plus souvent que n'importe quel autre numéro.Une amélioration serait d'essayer quelque chose comme ceci:
Laisser
n
être un entier positif où vous voulez un entier aléatoire dans l'intervalle 0..n-1, letm
être la plus petite puissance de 2 supérieure ou égale àn
.Ce sera plus lent, mais le nombre d'itérations est de 2. Aussi, si vous utilisez la même gamme à plusieurs reprises, vous pouvez pré-calculer
m
.un amendement visant à dohashi's réponse peut être de prendre
m
que le premier nombre premier supérieur ou égal àn