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

时间:2013-11-08 02:14:42

标签: 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.*;

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运算符完成此操作的吗?

2 个答案:

答案 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-minnextInt的值,如果{0,则会从-(max-min)返回nextInt {1}}返回否定。因此,abs会返回0max-min范围内的数字,添加min可以获得minmax范围内的数字

但是,我不建议这样做。当您从一组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来源的评论:

* 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)做了必要的工作,不使用它的唯一理由就是如果它是家庭作业而且你不被允许。