随机()解释

这是一个非常简单的 Java 问题(尽管可能适用于所有编程) :

Math.random()返回一个介于0和1之间的数字。

如果我想返回一个介于0和100之间的整数,我会这样做:

(int) Math.floor(Math.random() * 101)

一百到一百之间,我会这么做:

(int) Math.ceil(Math.random() * 100)

但是,如果我想得到一个介于3和5之间的数字,会不会像下面这样:

(int) Math.random() * 5 + 3

我知道 java.lang.util.Random中的 nextInt(),但是我想学习如何用 Math.random()做这个。

900807 次浏览

位于 java.util包中的 Random Java 类将更好地满足您的需求。它有一些返回整数的 nextInt()方法。接受 int 参数的参数将生成一个介于0和 int 之间的数字,后者不包含在内。

int randomWithRange(int min, int max)
{
int range = (max - min) + 1;
return (int)(Math.random() * range) + min;
}

产量是 randomWithRange(2, 5)的10倍:

5
2
3
3
2
4
4
4
5
4

边界是包含的,即[2,5] ,并且在上面的示例中,min必须小于 max

编辑: 如果有人试图愚蠢地逆转 minmax,你可以将代码改为:

int randomWithRange(int min, int max)
{
int range = Math.abs(max - min) + 1;
return (int)(Math.random() * range) + (min <= max ? min : max);
}

编辑2: 对于你关于 doubles 的问题,它只是:

double randomWithRange(double min, double max)
{
double range = (max - min);
return (Math.random() * range) + min;
}

同样,如果你想让自己不犯傻,只需要:

double randomWithRange(double min, double max)
{
double range = Math.abs(max - min);
return (Math.random() * range) + (min <= max ? min : max);
}

如果您想生成一个从0到100的数字,那么您的代码将如下所示:

(int)(Math.random() * 101);

生成一个从10到20的数字:

(int)(Math.random() * 11 + 10);

一般来说:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(其中包括 lowerboundupperbound)。

包含或排除 upperbound取决于您的选择。 我们假设 range = (upperbound - lowerbound) + 1那么 upperbound是包含的,但是如果 range = (upperbound - lowerbound)那么 upperbound是独占的。

例如: 如果我想要一个介于3-5之间的整数,那么如果范围是(5-3) + 1,那么5是包含的,但是如果范围只是(5-3) ,那么5是独占的。

下面是一个接收边界并返回随机整数的方法。它稍微高级一些(完全通用) : 边界可以是 正面和负面都有,最小/最大边界可以以任何顺序出现。

int myRand(int i_from, int i_to) {
return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

一般来说,它找出边界之间的绝对距离,得到相关的随机值,然后根据底部边界移动答案。

要生成包含10到20的数字,可以使用 java.util.Random

int myNumber = new Random().nextInt(11) + 10