具体来说,如果以下列形式使用:
Random.nextFloat() * N;
我可以期望从 0 到 N 的值高度随机分布吗?做这样的事情会更好吗?
Random.nextInt(N) * Random.nextFloat();
具体来说,如果以下列形式使用:
Random.nextFloat() * N;
我可以期望从 0 到 N 的值高度随机分布吗?做这样的事情会更好吗?
Random.nextInt(N) * Random.nextFloat();
来自一个好的生成器的单个随机数 - 并且java.util.Random
是一个好的 - 将均匀分布在整个范围内......它将具有 0.5*N 的平均值和中值。1/4 的数字将小于 0.25*N,1/4 的数字将大于 0.75*N,以此类推。
如果然后将其乘以另一个随机数生成器(其平均值为 0.5),您最终将得到一个平均值为 0.25*N 且中值为 0.187*N 的随机数......所以你的一半数字是小于 0.187*N!1/4 的数字将低于 0.0677*N!只有 1/4 的数字会超过 0.382*N。(通过查看作为其他两个随机数的乘积生成的 1,000,000 个随机数并分析它们而通过实验获得的数字。)
这可能不是你想要的。
起初,Java 中的 Random 不包含 rand() 方法。请参阅文档。我认为您考虑过 Random.next() 方法。
由于您的问题,文档说 nextFloat() 是这样实现的:
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
所以你不需要使用其他任何东西。
Random#nextFloat() 会给你一个介于 0 和 1 之间的均匀分布的数字。
如果你取一个均匀分布并将它乘以 N,你就可以均匀地扩大分布。所以你得到一个 0 到 N 之间均匀分布的随机数。
如果将其乘以 0 到 N 之间的随机数,那么您将得到不均匀分布。如果乘以 N 可以得到 0 和 N 之间的均匀分布,那么乘以 0 和 N 之间的数字,必须得到小于或等于仅乘以 N 的答案。因此,平均数字更小。