我希望用数字1到10填充数组a并从该数组中取一个随机数并将其添加到数组b并从数组a中删除该元素。我想知道最有效的方法。编辑:(练习要求我在数组中没有重复的值,并且每次调用方法时排列都是随机的。)到目前为止,这是我的方法:
public int[] nextPermutation() {
int capOne = 10;
int capTwo = 10;
int aSize = 0;
int bSize = 0;
int[] a = new int[capOne];
int[] b = new int[capTwo];
int upperBound = 11;
Random generator = new Random();
//fill initial array with 1 - 10
for (int i = aSize; i < 10; i++) {
a[i] = i + 1;
//companion variable for sizing array
aSize++;
}
//Create a random integer and add it to array b
//Remove same integer from array a
//Repeat and remove another random integer from the remaining integers in array a and add it to b
permuted = b;
return permuted;
}
我可能会以低效的方式接近这个,如果不是完全错误的话。如果是这样,我相信你会毫不犹豫地告诉我。非常感谢任何帮助。
答案 0 :(得分:1)
你可以:
//randomly choose element
int index = (int) (Math.random() * aSize);
int dataFromA = a[index];
//"remove" it from A
aSize--;
for(int i = index; i<aSize; i++) {
a[i] = a[i+1];
}
//"add" it to b
b[bSize] = dataFromA;
bSize++;
只有有趣的部分是从A中移除,你必须在周期之前缩小尺寸(或者你可以i < aSize-1
,然后减小尺寸)
我猜你必须使用数组,因为这是一个例外,但使用List
会更好。
答案 1 :(得分:0)
这是一个使用swap生成随机排列的程序。好吧,我不确定哪个可以产生更好的结果,但是交换应该比添加/删除数组更快:
public int[] nextPermutation() {
int cap = 10;
int[] a = new int[cap];
Random generator = new Random();
//fill initial array with 1 - 10
for (int i = 0; i < cap; i++) {
a[i] = i + 1;
}
for (int i = 0; i < cap; i++) {
int j = generator.nextInt(cap);
int x = a[j];
a[j] = a[i];
a[i] = x;
}
// You can reduce the size of the output array:
// int output[] = new int[5];
// System.arraycopy(a, 0, output, 0, 5);
// return output;
return a;
}