Java 打印范围内的非重复随机数

Java 打印范围内的非重复随机数,java,random,set,Java,Random,Set,我正在尝试编写一个简单的随机数生成器类,该类将在给定的最大值和最小值范围内打印非重复数。我已经完成了所有逻辑,并且我也在使用一个集合,但是我仍然会得到一些重复数。这个想法是,如果我声明最小值和最大值分别为0和5,我应该得到像23 1 5 4 0这样的随机数。然后,它可以重置,并给我的数字再次随机范围内没有重复。请参阅下面的代码 package RandomNumberGen; import java.util.*; public class RandomNumberGenerator { R

我正在尝试编写一个简单的随机数生成器类,该类将在给定的最大值和最小值范围内打印非重复数。我已经完成了所有逻辑,并且我也在使用一个集合,但是我仍然会得到一些重复数。这个想法是,如果我声明最小值和最大值分别为0和5,我应该得到像23 1 5 4 0这样的随机数。然后,它可以重置,并给我的数字再次随机范围内没有重复。请参阅下面的代码

package RandomNumberGen;

import java.util.*;
public class RandomNumberGenerator {

Random random = new Random();
int minimum;
int maximum;

Set<Integer> hSet = new HashSet<>(range);

public RandomNumberGenerator(int min, int max)
{
    minimum =  min;
    maximum = max;
}

public void generateRandomNumbers()
{
    int range =  maximum - minimum + 1; 
    int randomValue = 0; 

    if(shouldReset())
    {
        hSet.clear();
    }

    do
    {
        randomValue =  minimum + random.nextInt(range); 
    } while(!hSet.add(randomValue));

    System.out.println("The next random number is: " + randomValue);  

}

public boolean shouldReset()
{
    return hSet.size() >= maximum - minimum + 1;
}


public static void main(String[] args) 
{
    RandomNumberGenerator rng = new RandomNumberGenerator(1,10);
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();

    System.out.println("Should restart now");

    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
    rng.generateRandomNumbers();
}
包随机数;
导入java.util.*;
公共类随机数生成器{
随机=新随机();
最小整数;
int最大值;
Set hSet=新哈希集(范围);
公共随机数生成器(最小整数,最大整数)
{
最小值=最小值;
最大值=最大值;
}
public void generateRandomNumbers()
{
整数范围=最大值-最小值+1;
int随机值=0;
如果(shouldReset())
{
hSet.clear();
}
做
{
随机值=最小值+随机值.nextInt(范围);
}而(!hSet.add(randomValue));
System.out.println(“下一个随机数是:“+randomValue”);
}
公共布尔值shouldReset()
{
返回hSet.size()>=最大值-最小值+1;
}
公共静态void main(字符串[]args)
{
RandomNumberGenerator rng=新的RandomNumberGenerator(1,10);
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
System.out.println(“现在应该重新启动”);
rng.generateRandomNumbers();
rng.generateRandomNumbers();
rng.generateRandomNumbers();
}
}

目前,在我的输出中,尽管使用哈希集删除非重复整数,我还是得到了这个结果:我希望得到类似于10 8 7 5 9 6的值,但是我得到了

下一个随机数是:9

下一个随机数是:6

下一个随机数是:8

下一个随机数是:9

下一个随机数是:6


下一个随机数是:8

当前,您的设置不防止重复。您应该将集合声明为字段,而不是局部变量。该集合基本上跟踪生成的数字

public class RandomNumberGenerator {

    private int minimum;
    private int maximum;
    private Random random = new Random();
    private Set<Integer> hSet =  new HashSet<>();

    public RandomNumberGenerator(int min, int max)
    {
        minimum = min;
        maximum = max;
    }

    public void printRandomNumber()
    {
        int range =  maximum - minimum + 1; 
        int randomValue = 0; 

        do
        {
            randomValue =  minimum + random.nextInt(maximum - minimum + 1); 
        } while(!hSet.add(randomValue));

        System.out.println("The next random number is: " + randomValue);    
    }
}
以及
重置
方法:

public void reset() {
    hSet.clear();
}

另一种方法是无序排列所有可用数字的列表,并按顺序返回无序排列列表的元素:

public class RandomNumberGenerator {

    private int minimum;
    private int maximum;
    private Iterator<Integer> iter;

    public RandomNumberGenerator(int min, int max) {
        minimum = min;
        maximum = max;
        reset();
    }

    public void printRandomNumber() {

        System.out.println("The next random number is: " + iter.next());
    }

    public boolean shouldReset() {
        return !iter.hasNext();
    }

    public void reset() {
        List<Integer> list = new ArrayList<>(IntStream.rangeClosed(min, max).boxed().collect(Collectors.toList()));
        Collections.shuffle(list);
        iter = list.iterator();
    }
}
公共类RandomNumberGenerator{
私有整数最小值;
私有整数最大值;
专用迭代器;
公共随机数生成器(最小整数,最大整数){
最小值=最小值;
最大值=最大值;
重置();
}
公共编号(){
下一个随机数是:“+iter.next()”;
}
公共布尔值shouldReset(){
return!iter.hasNext();
}
公共无效重置(){
List List=newarraylist(IntStream.rangeClosed(min,max).boxed().collect(Collectors.toList());
集合。洗牌(列表);
iter=list.iterator();
}
}
因为
Set hSet=new HashSet()
printRandomNumber
函数中本地声明,每次调用此函数时都会重新创建,因此它从不跟踪以前存储的内容


如果希望它在所有调用
printRandomNumber
的过程中保持不变,可以将其改为全局变量

我只需要在循环的条件下使用返回的布尔值
Set::add
<代码>而(!hSet.add(randomValue))
@AKSW已编辑。就我个人而言,我觉得这有点不太可读,但也许那只是我自己。好吧,是的-不需要编辑,正如你所说,我想这只是品味的问题。这里的用例很可能不是面向HPC的。我要么使用你的洗牌解决方案(这里已经足够了),要么使用ApacheCommons Math resp获得更高级的东西。Apache RNG库用于创建随机数等@Sweeper非常感谢,因为它可以打印出随机的非重复整数。我希望这个printRandomNumber方法在范围内的所有事情发生后继续生成数字。那么,我会在printRandom方法的while循环之后添加shouldReset布尔检查吗?@user6952090您应该添加另一个名为
reset
的方法。在
printRandomNumber
的开头,选中
shouldReset
,如果为真,请调用
reset
public class RandomNumberGenerator {

    private int minimum;
    private int maximum;
    private Iterator<Integer> iter;

    public RandomNumberGenerator(int min, int max) {
        minimum = min;
        maximum = max;
        reset();
    }

    public void printRandomNumber() {

        System.out.println("The next random number is: " + iter.next());
    }

    public boolean shouldReset() {
        return !iter.hasNext();
    }

    public void reset() {
        List<Integer> list = new ArrayList<>(IntStream.rangeClosed(min, max).boxed().collect(Collectors.toList()));
        Collections.shuffle(list);
        iter = list.iterator();
    }
}