Question

Lorsque vous utilisez un générateur de nombres aléatoires, c'est le meilleur moyen de l'utiliser pour une plus grande randomité de la nouvelle valeur:

  1. Avez-vous une méthode qui instancie chaque fois une nouvelle instance du fichier RNG, puis renvoie une valeur?

  2. Avoir une instance du générateur de ressources aléatoires au niveau classe, qui est instanciée une fois dans le constructeur, et tous les appels ultérieurs pour une nouvelle valeur aléatoire utilisant l'instance existante?

Le problème est qu’il peut y avoir de nombreux appels pour un nombre aléatoire, souvent dans des portées différentes et non connectées les unes aux autres.

Il ne s’agit pas d’un problème de performances, le fait que chaque appel puisse instancier une nouvelle instance ne fait aucune différence. Il s’agit du caractère aléatoire de la valeur renvoyée.

Était-ce utile?

La solution

Éditer: Je pense que je veux parler de l’option 3, comme mentionné dans une autre réponse, c’est-à-dire un gestionnaire aléatoire global, même si dans une classe spécifique, vous pouvez faire exactement la même chose.

L’option 2 présente un autre avantage: si vous avez un jour besoin de "rejouer" fonctionnalité de votre logiciel, vous pouvez simplement stocker la graine que vous avez utilisée pour initialiser le RNG. La prochaine fois, il vous suffira de forcer le GNA à utiliser la graine stockée et vous obtiendrez exactement le même comportement, en supposant qu’il n’ya pas d’autres problèmes tels que la concurrence / thread qui pourraient changer l’ordre d’exécution .

Vous voudrez peut-être faire quelque chose comme ceci si votre logiciel exécute une expérience qui nécessite beaucoup d’aléatoire, mais où vous voudrez peut-être répéter une exécution particulière pour la montrer à d’autres personnes. Il est également très utilisé dans les jeux informatiques où l’intelligence artificielle prendra des décisions en fonction de la pondération des choix possibles, mais avec finalement un nombre aléatoire "picking". quelle action ils prennent.

Cela permet également le débogage pour les bogues transitoires qui n'apparaissent qu'occasionnellement. Si vous ne stockez pas le germe de chaque exécution, il n’ya aucun moyen de recréer les conditions exactes qui ont provoqué le bogue.

Autres conseils

L'option 1 ne fonctionne pas, en fait.

L'option 2 est le seul choix. Les GNA exigent absolument que vous génériez les valeurs en séquence à partir d’une seule graine.

Votre " créer un nouveau générateur avec une nouvelle graine " brise le fondement mathématique. Ce que vous obtenez dépend alors totalement de vos graines, qui, malheureusement, ne seront pas très aléatoires.

Je suggère l’option 3: utiliser un seul générateur de ressources pendant toute la durée du programme. Cela nécessite un verrouillage ou un thread-local si le générateur de ressources réseau n'est pas thread-safe (par exemple, en .NET), mais cela simplifie la vie beaucoup plus facilement et vous n'avez pas à vous soucier de la répétition.

Voir la la page MiscUtil correspondante pour obtenir des détails sur la page. La classe NET StaticRandom que j’ai écrite à cette fin. (C'est incroyablement simple - rien d'intelligent.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top