Math.random()解释


133

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

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

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

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

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

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

但是,如果我想得到三到五之间的数字怎么办?它会像下面的语句:

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

我知道nextInt()java.lang.util.Random。但是我想学习如何使用Math.random()


为[3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening

9
顺便说一句:范围是从0.0到1.0(不包括1.0)(您永远不会真正获得1.0)使用nextInt()是一个更好的选择,不仅更简单而且也更快。
彼得·劳瑞

2
使用Math.ceil是错误的,它给人当错误的结果Math.random()返回0
starblue

如果Math.floor返回0.029怎么办?如何始终用一个语句获得两位数字?
Naisheel Verdhan,2015年

Answers:


165
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:对于您关于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);
}

1
如果您不使用(int)并希望它返回a double怎么办?
瑞士

如果要加倍,则只需将ints 替换为doubles(并且不需要类型转换)。我以为你想要ints,但我会加到我的帖子中。
AusCBloke 2011年

2
实际上,使用doubles可以删除,+ 1因为Math.random()它不会被截断。但是,该范围将为[min,max),因为Math.random“返回一个带正号的大于或等于0.0且小于1.0的双精度值”。max即使有可能,该数字的可能性也很小。
AusCBloke 2011年

44

如果要生成一个从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之间的整数,则如果range是(5-3)+1,则5是包含的,但如果range只是(5-3),则5是排斥的。


2
upperbound独家?我认为它将具有包容性。
vidit 2016年

1
@vidit它是独家的

1
不要以为你刚开大画面上界可以是,在所提供的示例
Teezy7

19

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


我更新了我的问题,我想知道如何使用Math.random()。谢谢。
瑞士

1

要生成介于10到20之间(包括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);
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.