Math.random()解释

134

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

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

如果我想返回0到100之间的整数,我该怎么做:

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

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

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

但是如果我想要获取三到五之间的数字呢?这个语句会是下面这样吗:

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

我知道在java.lang.util.Random中有nextInt()方法。但是我想学习如何使用Math.random()实现同样的功能。


对于 [3,5]:(int)Math.floor(Math.random()*3) + 3 - good_evening
9
顺便提一下:范围从0.0(包括)到1.0(不包括),实际上您永远不会得到1.0。使用nextInt()是更好的选择,不仅更简单,而且更快。 - Peter Lawrey
2
使用 Math.ceil 是错误的,当 Math.random() 返回 0 时,它会给出错误的结果。 - starblue
如果 Math.floor 返回 0.029 呢?如何用一条语句始终获得两位数? - Naisheel Verdhan
5个回答

164
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: 关于您对于 double 的问题,答案就是:

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

1
如果您不使用(int)并希望返回double,该怎么办? - switz
如果你想要双精度浮点数,只需将“int”替换为“double”(并且类型转换是不必要的)。我假设你想要整数,但我会在我的帖子中添加。 - AusCBloke
2
实际上,使用double时也可以删除+1,因为Math.random()没有被截断。然而,范围将会是[min,max),因为Math.random“返回一个带有正号的double值,大于或等于0.0且小于1.0。”即使可能,这个数字恰好是max的机会也非常小。 - AusCBloke

45

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

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

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

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

一般情况下:

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

(其中lowerbound是包含的,而upperbound是不包含的。)

upperbound的包含或排除取决于您的选择。 假设range = (upperbound - lowerbound) + 1,则upperbound是包含的,但如果range = (upperbound - lowerbound),则upperbound是不包含的。

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


2
upperbound 是不包括的吗?我认为它应该是包括的。 - vidit
1
@vidit 这是独家的。 - user6110959
1
不要认为你已经掌握了整个情况,上限可以是任何一个值,就像示例中提供的那样。 - Teezy7

19

Java中位于java.util包中的Random类将更好地满足您的需求。它具有一些nextInt()方法,返回一个整数。其中一个需要传入一个int参数的方法会生成一个介于0和该int之间(不包括后者)的数字。


我更新了我的问题,我想知道如何使用Math.random()来实现。谢谢。 - switz

1
要生成一个10到20之间的数,你可以使用java.util.Random
int myNumber = new Random().nextInt(11) + 10

0
这是一个接收边界并返回随机整数的方法。它稍微复杂一些(完全通用):边界可以是正数和负数,最小/最大边界可以以任何顺序出现。
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);
}

通常情况下,它会找到边界之间的绝对距离,获取相关的随机值,然后根据底部边界来进行答案的偏移。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接