方法2(のわずかに変更されたバージョン)は非常に単純で、実際には
ウィキペディアで提供されているパレート分布関数の定義を使用する
FX(x)={1−(xmx)α0x≥xm,x<xm,
とを取る場合、との比率で最大となるあなただけで比率で拡張することができ意味、と直線拒絶サンプリングを使用します。それはかなり効率的です。 α=γP、X、Q、X=FX(X+1xm=12α=γpxx=1x=1qx=FX(x+12)−FX(x−12)x=1x=1
より明確にするために:とを使用してパレートから生成し、(切り捨てではなく)最も近い整数に丸める場合、拒否サンプリングを使用することが可能と思われますで -の各生成された値そのプロセスの確率で受け入れられる。 α=γM=P1/Q1XPのXxm=12α=γM=p1/q1xpxMqx
(ここでのは私が怠惰であるため、少し切り上げられました。実際には、この場合の適合は少し異なりますが、プロットで異なるようにするには十分ではありません。実際、小さい画像では、少し小さすぎるように見えます実際には小さすぎます)M
より慎重なのチューニングと(いくつかのために 0と1の間と言う)は、おそらく、さらに効率を高めるが、このアプローチは、私がプレイした場合には、合理的に良くないでしょう。 α α = γ - Axmαα=γ−aa
典型的な値の範囲をある程度理解できれば、そこで効率を詳しく調べることができます。γ
方法1は、ほぼ常に方法1を実行してから、尾を処理する別の方法を適用することにより、正確に適応させることもできます。これは非常に高速な方法です。
たとえば、長さが256の整数ベクトルを取得し、最初の値をで埋め、次の値をで埋める場合、まで続きます-これはほぼアレイ全体を使い果たします。残りのいくつかのセルは、右テールと左部分からの確率の小さな「残り」のビットの処理を組み合わせた2番目の方法に移動することを示しています。⌊ 256 P 2 ⌋ 256 P I < 1⌊256p1⌋1
⌊256p2⌋2
256pi<1
左側の残骸は、いくつかの方法で(たとえば、自動化されている場合は、「ヒストグラムを二乗する」と言っても、それほど効率的である必要はありません)、右側のテールは次のようにして実行できます。上記のAccept-Rejectアプローチのようなもの。
基本的なアルゴリズムは、1から256までの整数を生成することを含みます(これは、rngから8ビットのみを必要とします。効率が最優先の場合、ビット操作はそれらを「上から」取り、残りの均一な数値を残すことができます(最適です)このポイントまでの正規化されていない整数値として左)は、必要に応じて左の残党と右の尾を処理するために使用できます。
注意深く実装すると、この種の処理は非常に高速になる可能性があります。256 とは異なる値を使用できます(たとえば、が可能性があります)。ただし、概念的にはすべてが同じです。ただし、非常に大きなテーブルを使用する場合、尾を生成するために十分なビットがユニフォームに残っていない可能性があり、そこに2番目のユニフォーム値が必要です(ただし、非常にまれに必要になるため、それほど多くありません)問題)2 162k216
上記のように同じゼータ(2)の例では、212があるだろう1
の、26 2
の、7 3
の、3 4
の、いずれか5
と250から256の値は残りを扱うことになります。97%以上の時間で、表(1〜5)のいずれかの値を生成します。