Je pense que (une version légèrement modifiée de) la méthode 2 est assez simple, en fait
Utilisation de la définition de la fonction de distribution de Pareto donnée dans Wikipedia
FX( x ) = {1 -(XmX)α0x ≥Xm,x <Xm,
si vous prenez et alors le rapport de à est maximisé à , ce qui signifie que vous pouvez simplement mettre à l'échelle le rapport à et utiliser un échantillonnage de rejet direct. Il semble être relativement efficace.Xm=12α=γpxqx=FX(x+12)−FX(x−12)x=1x=1
Pour être plus explicite: si vous générez à partir d'un Pareto avec et et arrondissez à l'entier le plus proche (plutôt que tronqué), alors il semble possible d'utiliser l'échantillonnage de rejet avec - chaque valeur générée de partir de ce processus est acceptée avec probabilité .xm=12α=γM=p1/q1xpxMqx
( ici a été légèrement arrondi car je suis paresseux; en réalité, l'ajustement pour ce cas serait un tout petit peu différent, mais pas assez pour avoir l'air différent dans l'intrigue - en fait, la petite image lui donne l'air un peu trop petit quand c'est en fait une fraction trop grande)M
Un réglage plus soigneux de et ( pour certains entre 0 et 1 disons) augmenterait probablement encore l'efficacité, mais cette approche fonctionne assez bien dans les cas avec lesquels j'ai joué.xmαα=γ−aa
Si vous pouvez donner une idée de la plage typique de valeurs de je peux y regarder de plus près l'efficacité.γ
La méthode 1 peut également être adaptée pour être exacte, en exécutant presque toujours la méthode 1, puis en appliquant une autre méthode pour traiter la queue. Cela peut être fait de manière très rapide.
Par exemple, si vous prenez un vecteur entier de longueur 256, et remplissez les premières , valeurs avec , les prochaines valeurs avec et ainsi de suite jusqu'à - ce sera presque utiliser tout le tableau. Les quelques cellules restantes indiquent alors de passer à une deuxième méthode qui combine le traitement de la queue droite et également les minuscules bits de probabilité «restants» de la partie gauche.⌊256p1⌋1
⌊256p2⌋2
256pi<1
Le reste gauche pourrait alors être fait par un certain nombre d'approches (même avec, disons `` quadrature de l'histogramme '' s'il est automatisé, mais il ne doit pas être aussi efficace que cela), et la queue droite peut alors être faite en utilisant quelque chose comme l'approche d'acceptation-rejet ci-dessus.
L'algorithme de base consiste à générer un entier de 1 à 256 (ce qui ne nécessite que 8 bits de la rng; si l'efficacité est primordiale, les opérations sur les bits peuvent prendre celles-ci `` en haut '', laissant le reste du nombre uniforme (il vaut mieux être gauche comme valeur entière non normalisée à ce point) pouvant être utilisée pour traiter le reste gauche et la queue droite si nécessaire.
Mis en œuvre avec soin, ce genre de chose peut être très rapide. Vous pouvez utiliser des valeurs différentes de que 256 (par exemple pourrait être une possibilité), mais tout est théoriquement le même. Si vous prenez une très grande table, cependant, il peut ne pas y avoir suffisamment de bits dans l'uniforme pour qu'elle soit adaptée à la génération de la queue et vous avez besoin d'une deuxième valeur uniforme là-bas (mais elle devient très rarement nécessaire, donc ce n'est pas beaucoup de un problème)2k216
Dans le même exemple zeta (2) que ci-dessus, vous auriez 212 1
, 26 2
, 7 3
, 3 4
, un 5
et les valeurs de 250 à 256 traiteraient du reste. Plus de 97% du temps, vous générez l'une des valeurs du tableau (1-5).