Java 范围为+的随机发生器;例外

Java 范围为+的随机发生器;例外,java,random,generator,Java,Random,Generator,我想创建一个随机生成器,其中包含一个范围(由var1定义)和一个异常(由blockvar1定义) 我写道: Random rand = new Random(); int var1 = rand.nextInt(var1) + 1; do{ blockvar1 = rand.nextInt(var1) + 1; } while (var1 == blockvar1); 这应该能奏效。它创建一个给定最大值和最小值的整数,而不生成第三个参数中给定的数字 public static Inte

我想创建一个随机生成器,其中包含一个范围(由
var1
定义)和一个异常(由
blockvar1
定义)

我写道:

Random rand = new Random();
int var1 = rand.nextInt(var1) + 1;
do{
    blockvar1 = rand.nextInt(var1) + 1;
}
while (var1 == blockvar1);

这应该能奏效。它创建一个给定最大值和最小值的整数,而不生成第三个参数中给定的数字

public static Integer RandomNumberRange(int max, int min, int block)
{
    Random rand = new Random();
    int randomNum;

    do {
        randomNum = rand.nextInt((max - min) + 1) + min;
    } while (randomNum == block && (max != block && block != min));

    return randomNum;
}
调用范围为5-1和2的函数作为阻塞的输出示例

public static void main(String[] args) {
    for(int i = 0; i < 20; i++)
        System.out.print(RandomNumberRange(5, 1, 2) + " ");

}//main method

这应该能奏效。它创建一个给定最大值和最小值的整数,而不生成第三个参数中给定的数字

public static Integer RandomNumberRange(int max, int min, int block)
{
    Random rand = new Random();
    int randomNum;

    do {
        randomNum = rand.nextInt((max - min) + 1) + min;
    } while (randomNum == block && (max != block && block != min));

    return randomNum;
}
调用范围为5-1和2的函数作为阻塞的输出示例

public static void main(String[] args) {
    for(int i = 0; i < 20; i++)
        System.out.print(RandomNumberRange(5, 1, 2) + " ");

}//main method
我对您的代码有两个(小)问题:

  • 您似乎在使用
    var1
    有两个目的,它既是随机数的上限,也是随机数本身;这会导致混乱,结果可能与预期不符(即使在涉及随机数时预期模糊)
  • 我不太喜欢打圈。在实践中,它不会永远运行,但它运行的次数没有严格的上限
  • 以下是我的建议:

    private static Random rand = new Random();
    
    /**
     * Generates a pseudo-random number in the range 0..var1, but not blockvar1
     * @param var1 upper bound (inclusive) of random number
     * @param blockvar1 forbidden number
     * @return the generated random number
     */
    public static int randomNumberRange(int var1, int blockvar1) {
        if (blockvar1 < 0 || blockvar1 > var1) {
            throw new IllegalArgumentException("blockvar1 must be between 0 and var1 inclusive");
        }
        int result = rand.nextInt(var1);
        if (result >= blockvar1) {
            result++;
        }
        return result;
    }
    
    您会注意到,它提供了从0到4的数字,但从不提供2。

    我对您的代码有两个(次要)问题:

  • 您似乎在使用
    var1
    有两个目的,它既是随机数的上限,也是随机数本身;这会导致混乱,结果可能与预期不符(即使在涉及随机数时预期模糊)
  • 我不太喜欢打圈。在实践中,它不会永远运行,但它运行的次数没有严格的上限
  • 以下是我的建议:

    private static Random rand = new Random();
    
    /**
     * Generates a pseudo-random number in the range 0..var1, but not blockvar1
     * @param var1 upper bound (inclusive) of random number
     * @param blockvar1 forbidden number
     * @return the generated random number
     */
    public static int randomNumberRange(int var1, int blockvar1) {
        if (blockvar1 < 0 || blockvar1 > var1) {
            throw new IllegalArgumentException("blockvar1 must be between 0 and var1 inclusive");
        }
        int result = rand.nextInt(var1);
        if (result >= blockvar1) {
            result++;
        }
        return result;
    }
    

    你会注意到它会给你从0到4的数字,除了2以外。暂时没有理由,只要做
    if(var1>=blockvar1){var1++;}
    除此之外,“它不工作”到底意味着什么?你的预期输出不是什么?暂时没有理由,只要做
    if(var1>=blockvar1){var1++;}
    除此之外,“它不工作”的确切意思是什么?你的预期输出是什么?