我正在试图弄清楚如何使用mod运算符在用户预定义的范围之间生成数字。
我不想要的东西
int min = input.nextInt();
int max = input.nextInt();
Random r = new Random();
int X = r.nextInt(max - min + 1) + min;
我想要什么,类似于传统的int X = gen.nextInt()%100 + 1;而是使用Max和Min的值。
这是我到目前为止所拥有的
import java.util.*;
public class Modulus
{// begin class
public static void main(String[] args)
{// begin main
Scanner input;
int max, min, range;
Random gen;
gen = new Random();
input = new Scanner(System.in);
System.out.println("Please enter a max value: ");
max = input.nextInt();
// Ask user to input max value
System.out.println(" Please enter a minimum value: ");
min = input.nextInt();
// Ask user to input min value
range = gen.nextInt() % (Unknown)
// Get random integer between min and max values using %
System.out.println(" Your generated number is: " + range );
}
//end main
}
//end class
任何人都可以解释我是如何使用mod运算符完成此操作的吗?
答案 0 :(得分:1)
您可以使用Math.abs()
功能。
即
public static int genRandom(int mod){
Random r = new Random();
return Math.abs(r.nextInt()) % mod + 1;
}
并将您的高号作为参数插入。需要注意的是,它只适用于非负值。
答案 1 :(得分:1)
此
range = Math.abs(gen.nextInt() % (max - min + 1)) + min
会得到你想要的。如果%
返回正数或0,则0
运算符会返回从max-min
到nextInt
的值,如果{0
,则会从-(max-min)
返回nextInt
{1}}返回否定。因此,abs
会返回0
到max-min
范围内的数字,添加min
可以获得min
到max
范围内的数字
%
将其减少为一组N个整数时,如果M不能被N整除,则得到的分布将不均匀。某些结果将显示比其他人更频繁。我不确定你为什么不想使用gen.nextInt(max - min + 1)
,但它是适合这项工作的正确工具。
编辑:这样做的正确方法是:如果你有办法生成0到M-1(含)范围内的随机数,你需要一个范围内的随机数0到N-1(含),那么你只需要选择0到N *(M / N)-1范围内的数字[其中M / N是截断的整数除法],如果生成器选择一个数字范围N *(M / N)到M-1,循环返回并再试一次。然后,当您在结果上使用% N
运算符时,您将获得统一分布。 (如果生成器可以生成负值,则必须调整此算法。)Random.nextInt(int n)
的代码正是如此;这是JRE来源的评论:
* The algorithm is slightly tricky. It rejects values that would result * in an uneven distribution (due to the fact that 2^31 is not divisible * by n). The probability of a value being rejected depends on n. The * worst case is n=2^30+1, for which the probability of a reject is 1/2, * and the expected number of iterations before the loop terminates is 2.
所以,由于nextInt(n)
做了必要的工作,不使用它的唯一理由就是如果它是家庭作业而且你不被允许。