0

私の目標は、敵が殺された後にドロップするアイテムの数を個別に計算することです。たとえば、それぞれ50%の確率で50のポーションがドロップされるとすると、独立した試行に基づいて、0から50までの数字をランダムに返したいと思います。

現在、これは私が使用しているコードです:

int droppedItems(int n, float probability) {
    int count = 0;
    for (int x = 1; x <= n; ++x) {
        if (random() <= probability) {
            ++count;
        }
    }
    return count;
}

確率が0.0から1.0までの数値である場合、random()は0.0から1.0を返し、nはドロップされるアイテムの最大数です。これはC++コードですが、実際にはVisual Basic 6を使用しているため、これを支援するライブラリはありません。

このコードは完璧に機能します。ただし、これを最適化して、nが999999になった場合に、永久にかかることがないようにします(現在はそうなっています)。

4

2 に答える 2

2

二項分布を使用します。Wiki-二項分布

理想的には、この擬似コードが記述される言語に応じてライブラリを使用します。もちろん、車輪の再発明の方法を学ぼうとしているのでない限り、車輪の再発明には意味がありません。

具体的には、任意の試行と複数の試行で成功する確率を持つ二項分布が与えられた場合にランダムな値を生成できるものが必要になります。

編集 :

私は先に進んでこれを行いました(Pythonで、最近住んでいる場所なので)。それは非常に素晴らしいnumpyライブラリに依存しています(やったー、抽象化!):

>>>import numpy
>>>numpy.random.binomial(99999,0.5)
49853
>>>numpy.random.binomial(99999,0.5)
50077

そして、timeit.Timer実行時間をチェックするために使用します:

# timing it across 10,000 iterations for 99,999 items per iteration
>>>timeit.Timer(stmt="numpy.random.binomial(99999,0.5)", setup="import numpy").timeit(10000) 
0.00927[... seconds]

編集2:

結局のところ、二項分布に基づいて乱数ジェネレーターを実装する簡単な方法はありません。

二項分布から確率変数を生成するライブラリサポートなしで実装できるアルゴリズムがあります。ここでPDFとして表示できます

私の推測では、それを何に使用したいか(モンスターがゲームで戦利品を落とす)を考えると、アルゴリズムを実装することはあなたの時間の価値がありません。ここにはファッジファクターの余地があります!

私はあなたのコードをこのように変更します(注:これは二項分布ではありません):

  1. 現在のコードを小さな値、たとえばn最大まで使用します100
  2. n100を超える場合は、現在のアルゴリズムを使用するためのの値を計算してcountから 100、結果に。を掛けます n/100

繰り返しになりますが、BTPEアルゴリズムを自分で実装する方法を本当に理解したい場合は、次のことができます。上記の方法は、書く努力と「十分に近づく」ことの間のトレードオフで勝つと思います。

于 2012-09-20T17:56:54.470 に答える
0

@IamChuckBがすでに指摘しているように、キーワードは二項分布です。ベルヌーイ試行の数(例ではアイテムの数)が十分に多い場合、適切な近似はポアソン分布です。これは、計算と数値の抽出がはるかに簡単です(正確なアルゴリズムはリンクされたウィキペディアの記事で詳しく説明されています)。

于 2012-09-20T19:46:06.020 に答える