如何使用 Math.random() 在 Java 中模拟 60% 的概率

How to simulate 60% probability in Java with Math.random()

如果有 60% 的机会我想做某事(仅通过使用 Math.random())。例如,数组中的每个值都有 60% 的机会设置为 1 的情况,否则为 0。

我的困惑是我们是否应该检查

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

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

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

使用 < 运算符。

虽然这是一种简化,但通过添加 2−n 形式的项来考虑 computers store fractions。大多数实数无法精确表示,像 0.6 这样的文字会从有限集中转换为 最近的 double 值。

同样,random() 函数无法从 0 到 1 之间的连续范围生成实数值。相反,它从 0 到 N − 1 范围内的 N 个元素中选择一个整数,然后将其除以 N 以产生 [0, 1) 范围内的(有理数)结果。如果您想满足概率为 P, 的条件,则 P 应该成立 ⋅ N 元素来自 N 种可能性。

由于零被算作元素之一,因此应该包含的最大结果值为( PN − 1 ) / N。或者,换句话说,我们应该 exclude PN / N,即 P.

排除 P 导致使用 <

当你考虑如何使用像 nextInt(), 这样的方法时,可能更容易推理在那里,零对小范围的影响更明显,你的表达式显然会使用 < 运算符:current().nextInt(5) < 3。如果您除以结果,这不会改变:current().nextInt(5) / 5.0 < 0.6nextInt(5) / 5.0random() 之间的区别只是后者在 0 和 1 之间有更多、更小的步长。

对于我原来的回答误导了大家,我深表歉意,感谢the user的指正。

使用<。如果您想将赔率设置为 0%,则可以将比较值更改为 0。由于 Math.random() 可以 return 0,因此使用 <= 不会导致 0% 的机会.正如其他人指出的那样,Math.random() 生成您正在测试的确切数字的可能性极低,因此对于 0 以外的所有值,您永远不会注意到差异。