如果有60%的可能性,我想做点什么(只使用Math.random().例如,数组中的每个值都有60%的几率被设置为1,否则为0.
我的困惑是我们是否应该判断一下
if (Math.random() < 0.6) { ... }
或
if (Math.random() <= 0.6) { ... }
我的 idea 是,它应该是第一个,因为0.0算作可能的返回值,但我想确认我应该使用哪一个,以及为什么.
如果有60%的可能性,我想做点什么(只使用Math.random().例如,数组中的每个值都有60%的几率被设置为1,否则为0.
我的困惑是我们是否应该判断一下
if (Math.random() < 0.6) { ... }
或
if (Math.random() <= 0.6) { ... }
我的 idea 是,它应该是第一个,因为0.0算作可能的返回值,但我想确认我应该使用哪一个,以及为什么.
这取决于比较中实际值的最接近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 .
对于按原样使用或向下调整的值,您希望使用<
,而对于向上调整的操作数,生成临界值的几率为2-52.这与内存中的一个位翻转的可能性是一样的,在大多数应用程序中,我们忽略它的可能性非常小.
如果你能使用nextInt()
,,那么很明显,你的表达式会使用<
运算符:current().nextInt(5) < 3
.其他读者在解读Math.random() < val
这样的表达时也会倾向于同样的直觉.他们忘记了val
可能与他们在代码中编写的文字实数的值不同.
我建议你坚持<
,即使是Math.random()
.虽然理论上它并不总是"最好"的操作符,但在实践中它会给出相同的结果,并且它将避免那些后来阅读和修改代码的人的大量挠头和错误.