This is a pretty simple Java (though probably applicable to all programming) question:
Math.random()
returns a number between zero and one.
If I want to return an integer between zero and hundred, I would do:
(int) Math.floor(Math.random() * 101)
Between one and hundred, I would do:
(int) Math.ceil(Math.random() * 100)
But what if I wanted to get a number between three and five? Will it be like following statement:
(int) Math.random() * 5 + 3
I know about nextInt()
in java.lang.util.Random
. But I want to learn how to do this with Math.random()
.
int randomWithRange(int min, int max)
{
int range = (max - min) + 1;
return (int)(Math.random() * range) + min;
}
Output of randomWithRange(2, 5)
10 times:
5
2
3
3
2
4
4
4
5
4
The bounds are inclusive, ie [2,5], and min
must be less than max
in the above example.
EDIT: If someone was going to try and be stupid and reverse min
and max
, you could change the code to:
int randomWithRange(int min, int max)
{
int range = Math.abs(max - min) + 1;
return (int)(Math.random() * range) + (min <= max ? min : max);
}
EDIT2: For your question about double
s, it's just:
double randomWithRange(double min, double max)
{
double range = (max - min);
return (Math.random() * range) + min;
}
And again if you want to idiot-proof it it's just:
double randomWithRange(double min, double max)
{
double range = Math.abs(max - min);
return (Math.random() * range) + (min <= max ? min : max);
}
If you want to generate a number from 0 to 100, then your code would look like this:
(int)(Math.random() * 101);
To generate a number from 10 to 20 :
(int)(Math.random() * 11 + 10);
In the general case:
(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);
(where lowerbound
is inclusive and upperbound
exclusive).
The inclusion or exclusion of upperbound
depends on your choice. Let's say range = (upperbound - lowerbound) + 1
then upperbound
is inclusive, but if range = (upperbound - lowerbound)
then upperbound
is exclusive.
Example: If I want an integer between 3-5, then if range is (5-3)+1 then 5 is inclusive, but if range is just (5-3) then 5 is exclusive.
要生成介于10到20之间的数字,可以使用java.util.Random
int myNumber = new Random().nextInt(11) + 10
Here's a method which receives boundaries and returns a random integer. It is slightly more advanced (completely universal): boundaries can be both positive and negative , and minimum/maximum boundaries can come in any order.
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);
}
In general, it finds the absolute distance between the borders, gets relevant random value, and then shifts the answer based on the bottom border.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.