如何使用 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 种可能性。
由于零被算作元素之一,因此应该包含的最大结果值为( P ⋅ N − 1 ) / N。或者,换句话说,我们应该 exclude P ⋅ N / N,即 P.
排除 P 导致使用 <
。
当你考虑如何使用像 nextInt()
, 这样的方法时,可能更容易推理在那里,零对小范围的影响更明显,你的表达式显然会使用 <
运算符:current().nextInt(5) < 3
。如果您除以结果,这不会改变:current().nextInt(5) / 5.0 < 0.6
。 nextInt(5) / 5.0
和 random()
之间的区别只是后者在 0 和 1 之间有更多、更小的步长。
对于我原来的回答误导了大家,我深表歉意,感谢the user的指正。
使用<
。如果您想将赔率设置为 0%,则可以将比较值更改为 0。由于 Math.random()
可以 return 0,因此使用 <=
不会导致 0% 的机会.正如其他人指出的那样,Math.random()
生成您正在测试的确切数字的可能性极低,因此对于 0 以外的所有值,您永远不会注意到差异。
如果有 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 种可能性。
由于零被算作元素之一,因此应该包含的最大结果值为( P ⋅ N − 1 ) / N。或者,换句话说,我们应该 exclude P ⋅ N / N,即 P.
排除 P 导致使用 <
。
当你考虑如何使用像 nextInt()
, 这样的方法时,可能更容易推理在那里,零对小范围的影响更明显,你的表达式显然会使用 <
运算符:current().nextInt(5) < 3
。如果您除以结果,这不会改变:current().nextInt(5) / 5.0 < 0.6
。 nextInt(5) / 5.0
和 random()
之间的区别只是后者在 0 和 1 之间有更多、更小的步长。
对于我原来的回答误导了大家,我深表歉意,感谢the user的指正。
使用<
。如果您想将赔率设置为 0%,则可以将比较值更改为 0。由于 Math.random()
可以 return 0,因此使用 <=
不会导致 0% 的机会.正如其他人指出的那样,Math.random()
生成您正在测试的确切数字的可能性极低,因此对于 0 以外的所有值,您永远不会注意到差异。