我想根据一些特定的约束打印 100 个 int 数组。
- 每个数组的长度可以从 2 到 10。
- 每个数组中的每一项都必须是唯一的
- 每个数组中的项目从最低到最高排序
- 没有相同的数组,意思是两个数组具有相同的长度和相同的项目
目前我有这段代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class prova {
public static void main(String[] args) {
Integer[] elements = new Integer[]{1,2,3,4,5,6,7,8,9,10};
Set<List<Integer>> seenAlready = new HashSet<>();
for (int i = 0; i < 100; i++) {
final Integer[] array = generateRandomArrayFromElements(elements);
Arrays.sort(array);
if (seenAlready.add(Arrays.asList(array)))
System.out.println(Arrays.toString(array));
}
}
private static Integer[] generateRandomArrayFromElements(Integer[] elements) {
int size = ThreadLocalRandom.current().nextInt(1, elements.length) + 1;
Integer[] array = new Integer[size];
ArrayList<Integer> usedIndices = new ArrayList<>(size);
for (int i = 0; i < array.length; i++) {
int randomIndex = getUniqueRandomIndex(usedIndices, size);
usedIndices.add(randomIndex);
array[i] = elements[randomIndex];
}
return array;
}
private static int getUniqueRandomIndex(ArrayList<Integer> usedIndices, int max) {
int randomIndex = ThreadLocalRandom.current().nextInt(0, max);
final boolean contains = usedIndices.contains(randomIndex);
if (contains)
randomIndex = getUniqueRandomIndex(usedIndices, max);
return randomIndex;
}
}
问题在于它只会生成彼此之间过于相似的数组。
他们看起来都一样!
看看它可能的输出之一:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7]
[1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我永远不会得到这样的数组:
[3,4,8,9]
[2,3,6,7,8]
每次他们以 [1,2,3,4]
开始,依此类推!
我不明白!
最佳答案
问题是您正在生成从 0 到 array.length 范围内的索引。
- 所以如果数组大小是2,那么你的范围是<0,2)
- 如果数组大小是3,那么你的范围是<0,3)
- ...
- 如果数组大小是10,那么你的范围是<0,10)
在那种情况下,无法生成与您向我们展示的结果不同的结果。
Spots to fill |Elements to choose from based on range
=======================================
[_,_] |[1,2,................] range <0,2)
[_,_,_] |[1,2,3,..............] range <0,3)
[_,_,_,_] |[1,2,3,4,............] range <0,4)
...
您应该像这样调用它 int randomIndex = getUniqueRandomIndex(usedIndices, elements.length);
请注意,max
已更改为 elements.length
。
关于java - 如何生成具有一些非常具体约束的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288725/