3

我正在 Absolute Java,第 5 章,练习 3 中做一个练习。面对一个让我感到困惑的问题。
先介绍一下背景吧。

问题是

在 Puzzlevania 的土地上,Aron、Bob 和 Charlie 争论了他们中的哪一个是有史以来最伟大的谜题者。

为了一劳永逸地结束这场争论,他们同意进行一场生死决斗。Aaron 的射手很差,只有 1>3 的概率击中他的目标。Bob 稍微好一点,以 1>2 的概率击中了他的目标。查理是一个专业的射手,从来没有错过。

击中意味着杀死,被击中的人退出决斗。为了弥补枪法上的不公平,三人决定轮流开火,从亚伦开始,然后是鲍勃,然后是查理。这个循环会重复,直到有一个人站着,那个人将成为有史以来最伟大的谜题人。一个明显且合理的策略是让每个人向还活着的最准确的射手射击,理由是这个射手是最致命的,并且有最好的反击机会。

编写一个程序来模拟使用这种策略的决斗。您的程序应该使用随机数和问题中给出的概率来确定射手是否击中目标。创建一个名为 Duelist 的类,其中包含决斗者的姓名和射击精度,一个指示决斗者是否还活着的布尔值,以及一个方法 ShootAtTarget ( Duelist target ),如果决斗者击中他的目标(使用随机数和射击精度),否则什么也不做。

一旦您可以模拟单次决斗,请在您的程序中添加一个循环来模拟 10,000 次决斗。计算每个参赛者获胜的次数并打印每个参赛者获胜的概率(例如,对于 Aaron,您的程序可能会输出“Aaron 赢得 3,595>10,000 次决斗或 35.95%”)。另一种策略是让亚伦故意错过他的第一杆。修改程序以适应这种新策略并输出每位参赛者获胜的概率。哪种策略对 Aaron 来说更好:故意错过第一枪还是尝试击中最好的射手?谁最有可能获胜,最好的射手还是最差的射手?

我的问题是:

如何使用随机数和问题中给出的概率来确定射手是否击中目标?

我不明白为什么要使用随机数和概率,它们之间有什么关系吗?

4

2 回答 2

9

用 生成一个随机数(在 范围内[0,1)Math.random,然后简单地检查它是否小于给定的概率。所以如果有人有 20% 的准确率,我们会有

Math.random() < 0.20

这在 20% 的情况下是正确的。


我不明白为什么要使用随机数和概率,它们之间有什么关系吗?

我认为理解这一点的最好方法是看一个简单的案例:考虑掷硬币。我们将如何模拟这样的事件?嗯,它有 50% 的机会落在尾巴上,有 50% 的机会落在头上。因此,如果我们有一个随机变量,它有 50% 的机会true和 50% 的机会false,我们可以使用这个变量来运行模拟,因为它类似于实际的硬币翻转本身,有正面falsetrue有尾巴(或相反,这真的没关系)。在这种情况下,我们会有类似的东西

boolean isHeads = Math.random() < 0.5;

上面写的内容以相同的方式工作,但概率不是 50%。

现在,如果您想知道为什么Math.random() < 0.5有 50% 的机会存在true,您应该从几何角度考虑它。从toMath.random()返回一个随机数- 并将此间隔减半。因此,随机数有 50% 的机会落在 的右侧,有 50% 的机会落在左侧。010.50.5

由于Math.random() < 0.5本质上是在问“是左边的随机数.5”,因此它有 50% 的机会true和 50% 的机会false

于 2012-12-01T01:51:23.853 回答
0

它们并不意味着完全随机数。要模拟射手“射击”,您应该使用给定的加权概率生成“命中”或“未命中”。

于 2012-12-01T01:51:58.423 回答