如果有60%的可能性,我想做点什么(只使用Math.random().例如,数组中的每个值都有60%的几率被设置为1,否则为0.

我的困惑是我们是否应该判断一下

if (Math.random() < 0.6) { ... }

if (Math.random() <= 0.6) { ... }

我的 idea 是,它应该是第一个,因为0.0算作可能的返回值,但我想确认我应该使用哪一个,以及为什么.

推荐答案

In theory

这取决于比较中实际值的最接近double的近似值.

虽然这是一个简化,但通过添加表单2(SUP> -N</SUP>)的术语来考虑computers store floating point numbers.因此,大多数真实值无法准确表示.

编译器将文本0.6转换为最接近的double值,在本例中,这个值已经是less than 0.6.为了尽可能在60%的时间内满足您的条件,请使用Math.random() <= 0.6

将其与0.4的操作数进行对比.这里,最接近的double值实际上是greater than 0.4.<=的操作员仍将是close%到40%,但严格来说将是more%到40%,这可能违反您的意图.

最后,考虑一个可以精确表示的操作数,比如0.5.这就是零的重要性所在.如果你使用<=,你的概率略高于50%;在这种情况下,你绝对应该使用<.

总之,如果将操作数调整到更高的值,<=是最准确的.如果将操作数调低到较低的值,<可能最符合您的意图.如果操作数根本没有调整,<是正确的 Select .

In practice

对于按原样使用或向下调整的值,您希望使用<,而对于向上调整的操作数,生成临界值的几率为2-52.这与内存中的一个位翻转的可能性是一样的,在大多数应用程序中,我们忽略它的可能性非常小.

如果你能使用nextInt(),,那么很明显,你的表达式会使用<运算符:current().nextInt(5) < 3.其他读者在解读Math.random() < val这样的表达时也会倾向于同样的直觉.他们忘记了val可能与他们在代码中编写的文字实数的值不同.

我建议你坚持<,即使是Math.random().虽然理论上它并不总是"最好"的操作符,但在实践中它会给出相同的结果,并且它将避免那些后来阅读和修改代码的人的大量挠头和错误.

Java相关问答推荐

转换为Biggram

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

填写文本字段后锁定PDF

如何在返回bigint []值的子查询中使用any?

neo4j java驱动程序是否会在错误发生时自动回滚事务?

JavaFX Maven Assembly插件一直打包到错误的JDK版本

嵌入式ActiveMQ Artemis Web控制台加载错误

如何找到MongoDB文档并进行本地化?

Hibernate EmptyInterceptor可以工作,但不能拦截器

当涉及到泛型时,类型推理在Java中是如何工作的?

如何在EXCEL单元格中添加形状和文本

如何从日期中截取时间并将其传递给组件?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

如何使这两种方法合二为一?

在应用程序运行时更改LookAndFeel

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误

在java中使用SevenZip.openArchive方法后无法删除文件