8

言語を学習するための継続的な取り組みの一環として、Java で宇宙戦闘ゲームを開発しています。ある戦闘で、k隻の船が n 隻の極悪非道な敵艦隊に向けて発砲しまし。どれだけの数の敵に命中するかに応じて (各船は 1 つの敵に命中する 1 つの発砲を発射します)、一部は損傷し、一部は破壊されます。1 回攻撃された敵の数、2 回攻撃された敵の数などを把握したいので、最終的に 100 発の発砲に対して次のような表が得られます。

Number of hits | Number of occurences | Total shots
----------------------------------------------------
       1       |        30            |      30
       2       |        12            |      24
       3       |         4            |      12
       4       |         7            |      28
       5       |         1            |       5

明らかに、少数のショットと敵に対して、各ショットをランダムに敵に配置し、最後に各ショットが何回撃たれたかを数えることで、これを力ずくで行うことができます。しかし、この方法は、1,000 万の敵の群れに対して 300 万の勇敢な英雄が発砲する場合、非常に非現実的です。

理想的には、私が望むのは、正確に何発のショットが当たる可能性があるかの分布を生成する方法です。次に、乱数ジェネレーターを使用してその分布上のポイントを選択し、このプロセスを繰り返して、ほぼすべてのショットが説明されるまで、毎回ヒット数を増やします。一般的な統計分布/どのくらいの数の敵が何回のショットで攻撃されるかを概算する方法はありますか?

私は、誕生日の問題から、何人の誕生日が正確に何人かの人々によって共有される確率を計算しようとしてきましたが、大きな進歩はありませんでした.

これをJavaで実装します。

編集:解決しやすいかもしれないこれの簡略化を見つけました: n敵がまったく攻撃されない確率の分布は何ですか? つまり、0 がヒットしない、1 がヒットしない、2 がヒットしない、などの確率です。

これは似たような問題です (わかりました、同じ問題ですが単純化されています) が、より簡単に解決できるように思われ、数回の反復で完全な分布を生成できます。

4

4 に答える 4

2

私は、各ショットが悪い船に命中する確率 h を持っていると仮定しています。h = 0 の場合、すべてのショットが外れます。h = 1 の場合、すべてのショットが何かに命中します。

では、b 発の弾を撃ったとしましょう。ヒットした船の期待値は単純に Hs = h * b ですが、これらはユニークなヒットした船ではありません。

したがって、Hs の長さの船のリストがあります。N 隻の敵船が与えられた場合、特定の敵船が命中する確率は 1/N です。したがって、最初の k スロットに入る可能性があるが、他のスロットには入らない可能性は

(1/N)^k * (1-1/N)^(Hs-k)  

これは Marko Topolnik の回答であることに注意してください。問題は、これが k スロットの任意の組み合わせではなく、最初の k スロットにある特定の船であることです。Hs 合計スロットの k 個のスロットの組み合わせの数を考慮して、これを修正する必要があります。

(Hs choose k) * (1/N)^k * (1-1/N)^(Hs-k)

これで、特定の船が k スロットに入る可能性があります。さて、N 隻の艦隊全体を考慮する必要があります。

(Hs choose k) * (1/N)^k * (1-1/N)^(Hs-k) * N

この式は、均一な分布で Hs 発の攻撃を受けた N サイズの艦隊内で k 回攻撃を受けたと予想される船の数を表しています。

数値の健全性チェック:

2 発の弾丸が命中し (Hs=2)、2 隻の敵船 (N=2) があったとします。各船にバイナリ ID を割り当て、考えられるヒット リストを列挙してみましょう。

00 (ship 0 hit twice)
01
10
11

1 回のヒット数は次のとおりです。

(2 choose 1) * (1/2)^1 * (1-1/2)^(2-1) * 2 = 1

2 回ヒットした船の数は次のとおりです。

(2 choose 2) * (1/2)^2 * (1-1/2)^(2-2) * 2 = 0.5

サニティ チェックを完了するには、ヒットの総数が Hs に等しいことを確認する必要があります。船が 2 回命中すると 2 発の弾丸が必要になり、船が 1 回命中すると 1 回の弾丸が必要になります。

1*1 + 0.5*2 = 2 == Hs  **TRUE**

Hs=3 および N=2 のもう 1 つの簡単な例:

(3 choose 1) * (1/2)^1 * (1-1/2)^(3-1) * 2
3 * 0.5 * 0.25 * 2 = 0.75

(3 choose 2) * (1/2)^2 * (1-1/2)^(3-2) * 2
3 * 0.5^2 * 0.5 * 2 = 0.75

(3 choose 3) * (1/2)^3 * (1-1/2)^(3-3) * 2
1 * 0.5^3 * 1 * 2 = 0.25

0.75 + 0.75*2 + 0.25*3 = 3 == Hs  **TRUE**
于 2013-05-09T04:27:11.403 に答える