在Java中模拟随机事件

时间:2012-12-01 01:48:51

标签: java

我在绝对Java,第5章,练习3中进行了一次练习。面对一个令我困惑的问题 让我先介绍一下背景。

问题

在Puzzlevania的土地上,Aron,Bob和Charlie争论其中哪一个是有史以来最伟大的益智游戏。

为了一劳永逸地结束辩论,他们同意了对死的决斗。亚伦是一名可怜的射手,只能以1> 3的概率击中他的目标。鲍勃有点好,并以1> 2的概率击中他的目标。查理是一名专家射手,从未错过。

击中意味着击杀并且被击中的人掉出决斗。为了弥补他们射击技巧的不公平性,三人决定轮流射击,首先是亚伦,然后是鲍勃,然后是查理。这个循环会重复,直到有一个人站着,那个人将成为史上最伟大的益智者。一个明显而合理的策略是让每个男人都能以最准确的射手仍然活着射击,理由是这个射手是最致命的并且有最好的击球机会。

使用此策略编写程序以模拟决斗。 您的程序应该使用 随机数和问题中给出的概率来确定是否 射手击中目标。创建一个名为的类 包含theler's的决斗者 名称和射击精度,一个布尔值,表示是否还活着, 和方法 ShootAtTarget(决斗者目标)将目标设置为死亡 thelerler击中他的目标(使用随机数和射击精度)和 否则什么都不做。

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

我的问题是:

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

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

2 个答案:

答案 0 :(得分:8)

使用Math.random生成一个随机数(范围为[0,1)),然后检查它是否小于给定的概率。因此,如果某人有20%的准确率,我们就会

Math.random() < 0.20

这将是20%的时间。


  

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

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

这样的东西
boolean isHeads = Math.random() < 0.5;

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

现在,如果您想知道Math.random() < 0.5为什么true有50%的可能性,那么您应该在几何上考虑它。 Math.random()会将随机号码从0返回到1 - 而0.5会将此时间间隔缩短一半。因此,随机数将有50%的可能性落在0.5的右侧,并且有50%的可能性将落在左侧。

由于Math.random() < 0.5基本上要求“是.5左侧的随机数”,因此它有50%的可能性为true,有50%的可能性为false 1}}。

答案 1 :(得分:0)

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