0

決定論的なランダム イベントを生成する必要があるアプリを作成しています。アプリが閉じられたときにどのイベントが発生したかを計算できるように、決定論的である必要があります。完全なプロセスを生成せずに、任意の 2 つの時点の間で発生したイベントの数を示す関数 f(time1, time2) を見つけたいと思います。また、f(t1,t3) = f(t1,t2) + f(t2, t3) である必要があります。

私はこの質問から始めましたが、この新しい質問を開始したので、探しているものをよりよく理解できるようになったので、書き直すことができました。

コーディングの問題というよりも数学の問題のように思われるため、f の式を見つけることについて Math Overflow で質問を開始しました。

4

2 に答える 2

0

問題を書き直してみましょう。あなたfが存在したとします。次に、バイナリ検索を使用して、次のイベントの時間を必要な精度で見つけることができます。fしたがって、最初に構築します。

では、どのように作成できますfか? まあ、私たちは任意のfからまでを計算する必要があるだけです。0tf(s, t) = f(0, t) - f(0, s)

ごとに直接計算できる必要さえありませんt。すべての整数で計算できれば、また区間の両端で計算できれば、それで十分です。fは減少せず、常に整数であるため、二分アルゴリズムは最終的に、同じ値を持つことがわかっている 2 つのポイントの間に挟まれることになりますtf

そして今、アプローチがあります。整数で計算します。次にt、挟んだら、下限と上限f(0,t)が同じになるまで二等分を開始します。

乱数を生成し、ポアソン分布を使用して発生したイベントの数を見つけることにより、整数から整数に移動できます。間隔の両端でわかっている場合はf、同じトリックで中間点を見つけることができますが、今回は、間隔の前半で発生したイベントの数が二項分布によって記述されることを知っています。

関係のない 2 つの「次に進む」オプションを備えた疑似乱数ジェネレーターが必要であることを心配するトリックです。そのうちの 1 つは、次の間隔を移動するとき/間隔の上半分に着地するときです。もう 1 つは、間隔の移動を停止するか、間隔の下半分に着地する場合です。そして、同じ答えを出さないように、2 つの間を歩く道が必要です。そうしないと、ランダムなイベントが奇妙に定期的に配布されます。同じ範囲のシードを使用する 2 つの異なるジェネレーターを使用して、これを行うことをお勧めします。(近いが同じでない場合は、シードが共通の範囲に収まるまで、行っていることを繰り返すことができます...)どのジェネレーターを使用するかは、最後のフリップがどちらの方向に進んだかによって異なります.

使用する適切なものを見つけるには、ある程度の検討が必要になる場合があります。しかし、うまくいけば、それはあなたが始めた問題よりも簡単に理解できるでしょう!

于 2013-10-28T07:29:17.353 に答える
0

私があなたの制約を理解していれば、あなた (A) はプロセスを保存したくありません。プロセスが巨大だからです。(B) 同じ理由でプロセスを繰り返し生成したくない。しかし、ハイブリッド戦略を試すことができます。

(A) 決定論的にシードし、(B) 状態を読み取ることができる乱数ジェネレーター R を取得します (これを偽造する方法を以下で参照してください)。

今:

  • 保存R.state(またはハードコードされたものを使用して設定)
  • サンプルを生成Nし、それらを使用してポアソン過程を生成します。
  • (time, Poisson CDF, R.state)のトリプルを保存

後でデータに戻ると、関心のある間隔、ルックアップR.state、および CDF の前の最後の時間を見つけて、ポアソン過程の再生成を開始できます。余分なサンプルを生成する必要はありませんが、すべての状態Nを保存するだけで済みます。Nth

乱数発生器の状態をどのように保存しますか? それらのいくつかは、状態を読み取るための API 関数を持っています。もう 1 つのトリックは、2 つのジェネレーター 、 を使用することR1ですR2R2次に、を使用して N ポイントごとにシードしR1ます。の値R1は、保存する「状態」です。

于 2013-10-28T10:39:06.540 に答える