3

私はAbsoluteJava、第5章、演習3で1つの演習を行っています。そして、私を混乱させる問題に直面しています。
まず背景をご紹介します。

質問は

パズルバニアの地で、アロン、ボブ、チャーリーは、そのうちの1人が史上最高のパズルを解く人であるという議論をしました。

議論を終わらせるために、彼らは死への決闘に同意した。アーロンは射手が貧弱で、1>3の確率でターゲットに命中しました。ボブは少し良く、1>2の確率で目標を達成しました。チャーリーは熟練した射手であり、決して逃しませんでした。

ヒットはキルを意味し、ヒットした人は決闘から脱落します。射撃スキルの不平等を補うために、3人は、アーロン、ボブ、チャーリーの順に発砲することを決定しました。このサイクルは、一人の男が立つまで繰り返され、その男は史上最高のパズルを解く人になります。明白で合理的な戦略は、この射手が最も致命的であり、反撃する可能性が最も高いという理由で、各人がまだ生きている最も正確な射手を撃つことです。

この戦略を使用して決闘をシミュレートするプログラムを作成します。プログラムでは、問題で与えられた乱数と確率を使用して、射手がターゲットに当たるかどうかを判断する必要があります。決闘者の名前と射撃精度、決闘者がまだ生きているかどうかを示すブール値、および決闘者がターゲットに当たった場合にターゲットをデッドに設定するメソッドShootAtTarget(デュエリストターゲット)を含むDuelistという名前のクラスを作成します(乱数と射撃精度)、それ以外は何もしません。

単一の決闘をシミュレートできるようになったら、10,000の決闘をシミュレートするループをプログラムに追加します。各出場者が勝った回数を数え、各出場者の勝率を印刷します(たとえば、アーロンの場合、プログラムは「アーロンが3,595> 10,000の決闘または35.95%を勝ち取った」と出力する場合があります)。別の戦略は、アーロンが意図的に最初のショットを逃すことです。この新しい戦略に対応するようにプログラムを変更し、各競技者の勝率を出力します。アーロンにとってどちらの戦略が良いですか:最初のショットを意図的に逃すか、最高のシューティングゲームを打つことを試みますか?勝つ可能性が最も高いのは誰ですか、最高のシューティングゲームまたは最悪のシューティングゲームですか?

私の質問は:

問題で与えられた乱数と確率を使用して、射手がターゲットに当たるかどうかを判断するにはどうすればよいですか?

なぜ乱数と確率を使うべきなのか分かりませんが、それらの間に何か関係はありますか?

4

2 に答える 2

9

[0,1)を使用して(範囲内の)乱数を生成しMath.random、それが指定された確率よりも小さいことを確認します。したがって、誰かが20%の精度を持っていれば、

Math.random() < 0.20

これは20%の確率で当てはまります。


なぜ乱数と確率を使うべきなのか分かりませんが、それらの間に何か関係はありますか?

これを理解する最良の方法は、単純なケースを見ることだと思います。コインを投げることを検討してください。そのようなイベントをどのようにシミュレートしますか?尾に着地する可能性は50%、頭に着地する可能性は50%です。trueしたがって、50%の確率と50%の確率を持つ確率変数がある場合、falseこの変数を使用してシミュレーションを実行できます。これは、実際のコイントス自体に類似しており、false頭でありtrue、尾(またはその逆、それは本当に問題ではありません)。この場合、次のようになります。

boolean isHeads = Math.random() < 0.5;

上記の内容は同じように機能しますが、確率は50%以外です。

なぜMath.random() < 0.550%の確率で存在するのか疑問に思っている場合trueは、幾何学的に考える必要があります。から-までの乱数Math.random()を返し、この間隔を半分に短縮します。したがって、乱数がの右側に着地する確率は50%、左側に着地する確率は50%です。010.50.5

Math.random() < 0.5は本質的に「の左側の乱数である」と尋ねているので.5、50%の確率でtrue50%の確率で存在しfalseます。

于 2012-12-01T01:51:23.853 に答える
0

完全に乱数を意味するわけではありません。射手の「射撃」をシミュレートするには、与えられた加重確率を使用して「ヒット」または「ミス」を生成する必要があります。

于 2012-12-01T01:51:58.423 に答える