Récemment, je me suis habitué aux langages modernes qui incluent un bon générateur aléatoire de stock, qui est généralement le Twister de Mersenne; maintenant que je suis revenu au C ++, je dois décider quoi utiliser.
J'ai cherché des implémentations de Mersenne Twister et j'ai remarqué qu'il y en a tellement: y en a-t-il une qui est plus utilisée et plus répandue, ou suis-je censé en choisir une en supposant qu'elles sont toutes aussi bonnes?
Réponses:
C ++ 11 inclut par défaut un générateur Mersenne Twister dans le cadre de sa nouvelle
<random>
interface. Par exemple, pour générer uniformément des entiers entre [-10, 10] à l'aide de MT:La plupart de ces informations sont également disponibles dans tout compilateur proposant TR1, bien que les noms soient légèrement différents;
std::tr1::mt19937
etstd::tr1::uniform_int<int>
.Je déconseille généralement aux gens d'utiliser Mersenne Twister. C'est un algorithme correct, mais une grande partie de sa popularité n'est que du marketing. La dimension aléatoire de 624 est plus que ce dont la plupart des gens ont besoin, et MT comporte des exigences d'état relativement lourdes et lorsqu'il effectue un recalcul complet de la table, il peut faire sauter le cache. Je suis personnellement partisan de xorshift qui donne d'excellentes périodes et des distributions raisonnables pour tout ce dont un jeu a besoin, avec de minuscules besoins en mémoire et en CPU.
J'ai écrit un générateur xorshift conforme à C ++ 11 (principalement?) - xorshift.hpp , xorshift.cpp - et l' ai placé dans le domaine public. Vous pouvez le brancher dans n'importe quelle fonction de randomisation C ++ 11, comme ci-dessus:
la source
Un autre RNG que j'ai utilisé auparavant à des fins de gamedev est le "petit" RNG de Bob Jenkins, décrit ici .
(Il a également un RNG de force cryptographique appelé ISAAC, mais il est plus grand et plus lent, et les jeux n'ont pas besoin de ce niveau de force.)
la source