Java.nextFloat()的随机性是什么

时间:2013-09-18 13:48:01

标签: java random probability

具体而言,如果以下列形式使用:

Random.nextFloat() * N;

我可以期待从0到N的高度随机化的值分布吗? 做这样的事情会更好吗?

Random.nextInt(N) * Random.nextFloat();

3 个答案:

答案 0 :(得分:3)

来自良好生成器的单个随机数 - 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的数字将低于.0677 * N!只有1/4的数字将超过0.382 * N. (通过查看作为另外两个随机数的乘积生成的1,000,000个随机数进行实验获得的数字,并进行分析。)

这可能不是你想要的。

答案 1 :(得分:2)

首先,Java中的Random不包含rand()方法。见docs。我想你考虑过Random.next()方法。

由于您的问题,文档说nextFloat()实现如下:

public float nextFloat() {
   return next(24) / ((float)(1 << 24));
 }

所以你不需要使用任何其他东西。

答案 2 :(得分:1)

Random#nextFloat()将为您提供0到1之间均匀分布的数字。

如果采用均匀分布并将其乘以N,则可均匀地扩展分布。所以你得到一个0到N之间均匀分布的随机数。

如果将此乘以0到N之间的随机数,则会得到不均匀的分布。如果乘以N得到0和N之间的均匀分布,然后乘以0和N之间的数字,必须给出一个小于或等于的答案,如果你只是乘以N.所以你的数字平均值较小。