Math.random()解释

问题

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

Math.random()返回0到1之间的数字。

如果我想返回0到100之间的整数,我会这样做:

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

在一百到一百之间,我会这样做:

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

但是,如果我想获得三到五之间的数字怎么办?是否会像以下声明:

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

我知道关于nextInt()injava.lang.util.Random。但我想学习如何用Math.random()做到这一点。


#1 热门回答(140 赞)

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);
}

**EDIT2:**对于你的问题aboutdoubles,它只是:

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);
}

#2 热门回答(37 赞)

如果要生成0到100之间的数字,那么你的代码将如下所示:

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

要生成10到20之间的数字:

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

在一般情况下:

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

(wherelowerbound包括在内和upperboundexclusive)。

包含或排除upperbound取决于你的选择。让我们说411110027thenupperbound是包容性的,但ifrange = (upperbound - lowerbound)thenupperbound是独家的。

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


#3 热门回答(18 赞)

位于java.util包的Java的Random类将更好地服务于你的目的。它有一些返回整数的nextInt()方法。采用int参数的那个将生成一个介于0和int之间的数字,后者不包括在内。