java - 打印一定范围内的不重复随机数

标签 java random set

我正在尝试编写一个简单的随机数生成器类,它将打印给定的最大和最小范围内的非重复数字。我已经把逻辑全部搞清楚了,而且我也在使用一组,但是我仍然得到一些重复的数字。这个想法是,如果我将 min 和 max 声明为 0 和 5,我应该得到像 2 3 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();
}

}

目前在我的输出中,尽管使用 HashSet 删除非重复整数,我还是得到了这个:我期待类似 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);    
    }
}

您还应该添加一个方法调用shouldReset来指示是否生成了所有数字:

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

和一个重置方法:

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

关于java - 打印一定范围内的不重复随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447033/

相关文章:

java - Rock Paper Scissor Lizard Spock 游戏无法运行

python - 将整数转换为随机但确定性可重复的选择

python - 字符串文字中的特殊字符

Java - 转换 Set 的缺点?

Java构造函数并在运行时修改对象属性

java - JSP - 具有大量 HTML 代码的 Scriptlet 性能

java - 全局扫描仪可以工作一次,但在第二次运行时会变得有点毛茸茸的

java - 在 Java 中为 TreeSet 创建新的比较器

ios - swift 2.2 : creating random playlist for AVAudioPlayer

c++ - 生成可重现的大数序列 - 使用伪随机生成器?