Java 如何使用mod运算符在输入范围之间生成随机数?

Java 如何使用mod运算符在输入范围之间生成随机数?,java,Java,我试图找出如何在用户使用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.*; publi

我试图找出如何在用户使用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操作符来完成这个任务吗?

您可以使用
Math.abs()
函数

并将高数值作为参数插入。需要注意的是,它仅适用于非负值。

 range = Math.abs(gen.nextInt() % (max - min + 1)) + min 
你会得到你想要的。如果
nextInt
返回正数或0,则
%
运算符返回一个从
0
max-min
的值,如果
nextInt
返回负数,则返回一个从
0
-(max-min)
的值。因此
abs
将返回
0
max-min
范围内的数字,添加
min
将获得
min
max
范围内的数字

不过,我不建议这样做。当您从一组M个整数生成一个随机整数,然后使用
%
将其减少为一组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来源的评论:


因此,既然nextInt(n)做了必要的工作,不使用它的唯一原因就是如果它是家庭作业,你不允许使用。

可能重复@Jason不,那不是重复。链接的问题根本不使用
Random
,似乎是关于尝试
编写一个非常简单的随机数生成器。@Aztechnology使用公式int X=Random.nextInt(100-0+1)+0获得0-100之间的范围;它与nextInt(101)相同,那么有什么意义呢?谢谢不幸的是我还需要处理负值:\。无论如何谢谢你!如果
nextInt()
恰好返回
Integer.MIN\u VALUE
@ajb,则此操作将失败,这是事实,但实现有条件地重新生成数字并不容易。我第一次实际使用了几乎相同的代码,但得到的数字超出了范围。我再试试看。至于为什么,这是因为这是一个考试中的额外问题,一直困扰着我。
 range = Math.abs(gen.nextInt() % (max - min + 1)) + min 
* 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.