Math.random()解释

swi*_*itz 130 java math

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

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

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

(int) Math.floor(Math.random() * 101)
Run Code Online (Sandbox Code Playgroud)

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

(int) Math.ceil(Math.random() * 100)
Run Code Online (Sandbox Code Playgroud)

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

(int) Math.random() * 5 + 3
Run Code Online (Sandbox Code Playgroud)

我知道nextInt()java.lang.util.Random.但我想学习如何做到这一点Math.random().

Aus*_*oke 161

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

输出randomWithRange(2, 5)10次​​:

5
2
3
3
2
4
4
4
5
4
Run Code Online (Sandbox Code Playgroud)

边界是包容性的,即[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);
}
Run Code Online (Sandbox Code Playgroud)

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

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}
Run Code Online (Sandbox Code Playgroud)

再次,如果你想要愚蠢的证明它只是:

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

  • 实际上用`double`s删除`+ 1`也是因为`Math.random()`没有被截断.但是,范围将是[min,max],因为`Math.random`"返回带有正号的双精度值,大于或等于0.0且小于1.0." 即使有可能,这个数字的最小概率仍然很小. (2认同)

Tee*_*zy7 44

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

(int)(Math.random() * 101);
Run Code Online (Sandbox Code Playgroud)

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

(int)(Math.random() * 11 + 10);
Run Code Online (Sandbox Code Playgroud)

在一般情况下:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);
Run Code Online (Sandbox Code Playgroud)

(在哪里lowerboundupperbound包括在内).

包含或排除upperbound取决于您的选择.让我们说range = (upperbound - lowerbound) + 1upperbound是包容性的,但如果range = (upperbound - lowerbound)那时upperbound是排他性的.

示例:如果我想要一个介于3和5之间的整数,那么如果range是lowerbound5则包含但是如果range只是upperbound5则是独占的.

  • `upperbound`独家?我认为这将是包容性的. (2认同)

G_H*_*G_H 19

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