java - 在Java中模拟随机事件

标签 java

我正在做 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/

相关文章:

java - 遍历对象类型的列表

java - Netty SSL 中的字段长度溢出

java - 将 Play Framework 应用程序部署到生产环境的步骤?

java - 为什么循环将 ArrayList 中添加的项目加倍

java - 在JSP上使用超链接显示关系数据库记录的数据库

java - 无法初始化类 io.confluence.kafka.schemaregistry.client.rest.RestService

java - 关闭 Netbeans 后无法访问我的 Derby 数据库

java - 使用 Hibernate 保存对象

java - SpringBoot JUnit 和 @Value

java - For 循环 Java 无法访问语句