这是我即将完成的学校作业,但我并不完全正确。我应该通过检查重复项生成一个包含100个随机数的整数节点数组,没有重复。 我不允许使用Set。 我不允许只是洗一个数字1-1000的数组。
这是我到目前为止在我的客户端类中的代码,但它仍然会创建重复项:
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;
}
}
}
答案 0 :(得分:2)
我这样做的方法是使用List来存储所有随机数。然后当你生成一个数字时,你可以检查它是否已经存在于列表中,并获得另一个数字(这是通过递归完成的)或者是一个循环)。你继续这样做,直到你的名单已满。然后浏览创建阵列节点的列表。
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;
}
addUniqueRandomNumber方法:
public static void addUniqueRandomNumber(List<Integer> numbers, int range) {
int j = (int)(Math.random()*range);
if (numbers.contains(j)) {
addUniqueRandomNumber(numbers, range);
} else {
numbers.add(j);
}
}
答案 1 :(得分:1)
因为如果第一个随机数在第二个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;
}
这就是我要做的事情:
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++;
}
}
}
如果数字不重复,基本上只增加i
,否则请尝试查找另一个不重复的随机数。
答案 2 :(得分:1)
我建议使用辅助布尔数组来跟踪已添加到数组中的数字。查看此代码,简洁明了:
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;
}
}
}
}
如您所见,上面的实现不使用Set或shuffling。但是,您可以使用下面的测试代码查看它是否正常工作。
Set<Integer> set = new HashSet<Integer>();
for (int i : randomUniqueIntegers)
set.add(i);
System.out.println(set.size());
您将看到每次运行中集合的大小等于SIZE
常量,这表示我们的数组中包含所有唯一元素。
答案 3 :(得分:1)
在每个生成的数字存在之后检查的解算法是否为:
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;
}
}
然后你可以对蚂蚁打印随机数进行排序
Arrays.sort(nodeArray); // Sort to be easy find duplicates
for (Integer i : nodeArray) {
System.out.print(i + ", ");
}