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