Java 生成包含唯一随机整数的数组,检查重复项
这是我即将完成的学校作业,但我还没有完成。我应该通过检查重复项来生成一个包含100个随机数的整数节点数组,而不包含重复项。 我不允许使用电视机。 我不允许只洗牌1-1000的数字数组 以下是迄今为止我在客户端类中拥有的代码,但它仍然会创建重复的代码:Java 生成包含唯一随机整数的数组,检查重复项,java,arrays,nodes,Java,Arrays,Nodes,这是我即将完成的学校作业,但我还没有完成。我应该通过检查重复项来生成一个包含100个随机数的整数节点数组,而不包含重复项。 我不允许使用电视机。 我不允许只洗牌1-1000的数字数组 以下是迄今为止我在客户端类中拥有的代码,但它仍然会创建重复的代码: for (int i = 0; i < SIZE; i++) { int j = (int)(Math.random()*1999); //put a random number in the first index. i
for (int i = 0; i < SIZE; i++) {
int j = (int)(Math.random()*1999);
//put a random number in the first index.
if (i == 0) {
Node newNode = new Node(j);
nodeArray[i] = newNode;
}
for (int k = 0; k < i; k++) {
if (nodeArray[k].getInt() == j) {
j = (int)(Math.random()*1999);
break;
} else {
Node newNode = new Node(j);
nodeArray[i] = newNode;
}
}
}
for(int i=0;i
我这样做的方法是使用一个列表来存储所有随机数。然后,当您生成一个数字时,您可以检查它是否已经存在于列表中,并获得另一个数字(这是通过递归或while循环完成的)。你一直这样做,直到你的名单满为止。然后浏览为阵列创建节点的列表
List<Integer> numbers = new ArrayList<Integer>(SIZE);
for (int i = 0;i<SIZE; i++) {
addUniqueRandomNumber(numbers, SIZE*2);
}
for (int i =0;i<numbers.size; i++) {
Node newNode = new Node(numbers.get(i));
nodeArray[i] = newNode;
}
列表编号=新的ArrayList(大小);
对于(int i=0;i,因为当您分配一个新的随机数时,如果第一个随机数在您的第二个if语句中是重复的,则它不会检查该随机数是否也可能是重复的。您需要重新执行循环,并检查该数字是否也是重复的
for (int k = 0; k < i; k++) {
if (nodeArray[k].getInt() == j) {
j = (int)(Math.random()*1999); //You must check if this random is also a dup
break;
} else {
Node newNode = new Node(j);
nodeArray[i] = newNode;
}
for(int k=0;k
下面是我要做的:
int i = 0;
while (i < SIZE) {
int j = (int)(Math.random()*1999);
//put a random number in the first index.
if (i == 0) {
Node newNode = new Node(j);
nodeArray[i] = newNode;
i++;
}
for (int k = 0; k < i; k++) {
if (nodeArray[k].getInt() == j) {
//Do nothing
} else {
Node newNode = new Node(j);
nodeArray[i] = newNode;
i++;
}
}
}
inti=0;
而(i
基本上,如果数字不重复,则仅递增i
,否则请遍历并尝试找到另一个不重复的随机数。我建议使用辅助布尔数组来跟踪哪些数字已添加到数组中。查看此代码,它简短明了:
boolean[] used = new boolean[2000];
int[] randomUniqueIntegers = new int[SIZE];
for (int i = 0; i < SIZE; i++) {
int num = (int) (Math.random() * 1999);
if (!used[num]) {
used[num] = true;
randomUniqueIntegers[i] = num;
} else {
while (used[num]) {
num = (int) (Math.random() * 1999);
if (!used[num]) {
used[num] = true;
randomUniqueIntegers[i] = num;
break;
}
}
}
}
boolean[]used=new boolean[2000];
int[]randomUniqueIntegers=新的int[SIZE];
对于(int i=0;i
正如您所看到的,上面的实现没有使用Set或shuffling。但是,您可以使用下面的测试代码来查看它是否正常工作
Set<Integer> set = new HashSet<Integer>();
for (int i : randomUniqueIntegers)
set.add(i);
System.out.println(set.size());
Set Set=newhashset();
for(整数i:随机唯一整数)
增加(i);
System.out.println(set.size());
您将看到,在每次运行中,集合的大小等于size
常量,这表明我们的数组中有所有唯一的元素。在每个生成的数字存在后检查的解决方案算法是或否:
List<Integer> numbers = new ArrayList<Integer>(SIZE);
for (int i = 0;i<SIZE; i++) {
addUniqueRandomNumber(numbers, SIZE*2);
}
for (int i =0;i<numbers.size; i++) {
Node newNode = new Node(numbers.get(i));
nodeArray[i] = newNode;
}
int[] nodeArray = new int[100];
int currentIndex = 0;
while(currentIndex < 100) {
int currentValue = (int) (Math.random() * 199);
int i = 0;
while(i < currentIndex) {
if(currentValue == nodeArray[i]) {
break;
}
i++;
}
if(i == currentIndex) {
nodeArray[currentIndex++] = currentValue;
}
}
如果你发现一个重复的数字,仅仅选择一个新的数字是不够的。你必须检查这个新的数字,因为这可能是一个重复的数字。基本上,当你在索引i上时,不断生成随机数,直到你找到一个不在位置0..i-1上使用的数字。当你找到时,分配给索引i,并重复i+1。@RogerLindsjö因此改变我最里面的If状态需要一段时间吗?这会有帮助吗?@MagdaleneB。请检查我的答案。这很容易理解。while(used[num])迭代什么?@jrow08它不会迭代某个东西,它只是尝试找到一个未使用的整数,当循环中断时找到它。
Arrays.sort(nodeArray); // Sort to be easy find duplicates
for (Integer i : nodeArray) {
System.out.print(i + ", ");
}