問題を書き直してみましょう。あなたf
が存在したとします。次に、バイナリ検索を使用して、次のイベントの時間を必要な精度で見つけることができます。f
したがって、最初に構築します。
では、どのように作成できますf
か? まあ、私たちは任意のf
からまでを計算する必要があるだけです。0
t
f(s, t) = f(0, t) - f(0, s)
ごとに直接計算できる必要さえありませんt
。すべての整数で計算できれば、また区間の両端で計算できれば、それで十分です。f
は減少せず、常に整数であるため、二分アルゴリズムは最終的に、同じ値を持つことがわかっている 2 つのポイントの間に挟まれることになりますt
。f
そして今、アプローチがあります。整数で計算します。次にt
、挟んだら、下限と上限f(0,t)
が同じになるまで二等分を開始します。
乱数を生成し、ポアソン分布を使用して発生したイベントの数を見つけることにより、整数から整数に移動できます。間隔の両端でわかっている場合はf
、同じトリックで中間点を見つけることができますが、今回は、間隔の前半で発生したイベントの数が二項分布によって記述されることを知っています。
関係のない 2 つの「次に進む」オプションを備えた疑似乱数ジェネレーターが必要であることを心配するトリックです。そのうちの 1 つは、次の間隔を移動するとき/間隔の上半分に着地するときです。もう 1 つは、間隔の移動を停止するか、間隔の下半分に着地する場合です。そして、同じ答えを出さないように、2 つの間を歩く道が必要です。そうしないと、ランダムなイベントが奇妙に定期的に配布されます。同じ範囲のシードを使用する 2 つの異なるジェネレーターを使用して、これを行うことをお勧めします。(近いが同じでない場合は、シードが共通の範囲に収まるまで、行っていることを繰り返すことができます...)どのジェネレーターを使用するかは、最後のフリップがどちらの方向に進んだかによって異なります.
使用する適切なものを見つけるには、ある程度の検討が必要になる場合があります。しかし、うまくいけば、それはあなたが始めた問題よりも簡単に理解できるでしょう!