具有范围+异常的随机生成器

时间:2017-01-20 19:39:15

标签: java random generator

我想创建一个带范围的随机生成器(由var1定义)和一个异常(由blockvar1定义)

我写了这个:

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

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题。它创建一个给定最大值和最小值的整数,并且不生成第三个参数中给出的数字。

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

输出

1 5 5 1 5 4 3 3 4 1 5 5 5 1 5 4 3 5 1 5 

答案 1 :(得分:0)

我的代码存在两个(次要)问题:

  1. 您似乎将var1用于两个目的,它既是随机数的上限,也是随机数本身;这会引起混淆,结果可能不如预期(即使在随机数字方面期望很明显)。
  2. 我不是很喜欢循环。在实践中,它不会永远运行,但它运行的次数仍然没有硬上限。
  3. 这是我的建议:

    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;
    }
    

    重复调用randomNumberRange(4, 2)的示例输出:

    1 1 3 3 1 0 0 0 4 4 1 0 3 3 4 3 3 0 1 3 
    

    您会注意到它会为您提供0到4之间的数字,但不包括2。