我正在做 Absolute Java 中的一个练习,第 5 章,练习 3。面对一个让我困惑的问题。
先介绍一下背景吧。
问题是:
在 Puzzlevania 的土地上,Aron、Bob 和 Charlie 争论他们中的哪一个是有史以来最伟大的益智游戏。
为了一劳永逸地结束争论,他们同意进行生死决斗。阿龙射手很差,命中率只有1>3。 Bob 稍微好一点,以 1>2 的概率击中目标。查理是一名神枪手,从不失手。
击中意味着击杀,被击中的人退出决斗。为了弥补他们枪法技能的不平等,三人决定轮流开火,从亚伦开始,然后是鲍勃,然后是查理。循环将重复,直到有一个人站着,而那个人将成为有史以来最伟大的拼图者。一个明显而合理的策略是,每个人都向仍然活着的最准确的射手射击,理由是这个射手最致命,也最有可能反击。
使用此策略编写一个程序来模拟决斗。 你的程序应该使用 随机数和问题中给出的概率来确定是否 射手击中目标。 创建一个名为 包含决斗者的决斗者 姓名和射击准确度,一个 boolean 值,表示决斗者是否还活着, 和一个方法 ShootAtTarget ( Duelist target ) 将目标设置为死亡,如果 决斗者击中目标(使用随机数和射击精度)并且 否则什么也不做。
一旦你可以模拟单场决斗,在你的程序中添加一个循环来模拟 10,000 次决斗。计算每个参赛者获胜的次数并打印 每个参赛者获胜的概率(例如,对于 Aaron,您的程序可能 输出“Aaron 赢得了 3,595>10,000 次决斗或 35.95%”)。 另一种策略是让 Aaron 故意错过他的第一次投篮。修改 程序适应这个新策略并输出获胜的概率 对于每个参赛者。哪种策略对阿龙更好:故意错过 第一枪还是尝试击中最佳射手?谁最有可能获胜, 最好的射手还是最差的射手?
我的问题是:
如何使用随机数和题中给出的概率来判断射手是否射中目标?
我不明白为什么要用随机数和概率,它们之间有什么关系吗?
最佳答案
用 [0,1)
生成一个随机数(在 Math.random
范围内) ,然后简单地检查它是否小于给定的概率。所以如果有人有 20% 的准确率,我们就会有
Math.random() < 0.20
这将有 20% 的时间是正确的。
I don't understand why should use random numbers and probabilities, is there any relationship between them?
我认为理解这一点的最好方法是看一个简单的案例:考虑掷硬币。我们将如何模拟这样的事件?那么它有 50% 的机会落在尾部上,有 50% 的机会落在头上。因此,如果我们有一个随机变量,它有 50% 的机会是 true
并且有 50% 的机会成为 false
, 我们可以使用这个变量来运行模拟,因为它类似于实际的抛硬币本身,带有 false
是头和true
是尾部(或者相反,这真的无关紧要)。在这种情况下,我们会有类似的东西
boolean isHeads = Math.random() < 0.5;
上面写的内容以相同的方式工作,但概率不是 50%。
现在如果您想知道为什么 Math.random() < 0.5
有 50% 的机会是 true
,你应该从几何角度考虑。 Math.random()
从 0
返回一个随机数至 1
- 和 0.5
将这个间隔减半。因此,随机数有 50% 的几率落在 0.5
的右边。 , 它有 50% 的几率会落在左边。
自 Math.random() < 0.5
本质上是在问“是 .5
左边的随机数”,它有 50% 的机会是 true
并且有 50% 的机会成为 false
.
关于java - 在Java中模拟随机事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13655574/