0

我试图弄清楚如何在用户使用 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 运算符来完成此操作?

4

2 回答 2

1

您可以使用该Math.abs()功能。

IE

public static int genRandom(int mod){
  Random r = new Random();
  return Math.abs(r.nextInt()) % mod + 1;
}

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

于 2013-11-08T02:23:12.500 回答
1

这个

 range = Math.abs(gen.nextInt() % (max - min + 1)) + min 

会得到你想要的。%运算符返回值 from 0tomax-min如果返回正nextInt数或 0,或者 from 0to-(max-min)如果nextInt返回负数。所以abs将返回一个范围内的数字0to max-min,并添加min给你一个范围内的数字minto 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 来源的评论:

* 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)做了必要的工作,那么不使用它的唯一原因就是如果它是家庭作业并且您不允许这样做。

于 2013-11-08T02:31:27.280 回答