问题
这是一个非常简单的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
。
**编辑:**若有人试图愚蠢和反向min
和max
,你可以将代码更改为:
int randomWithRange(int min, int max)
{
int range = Math.abs(max - min) + 1;
return (int)(Math.random() * range) + (min <= max ? min : max);
}
**EDIT2:**对于你的问题aboutdouble
s,它只是:
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
包括在内和upperbound
exclusive)。
包含或排除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之间的数字,后者不包括在内。