1

我正在寻找用数字 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;
        }

如果不是完全不正确,我可能会以低效的方式处理这个问题。如果是这样,我相信你会毫不犹豫地告诉我。非常感谢您对此的任何帮助。

4

2 回答 2

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它会更好。

于 2013-07-02T05:59:12.737 回答
0

这是一个使用交换产生随机排列的程序。好吧,我不确定哪个可以产生更好的结果,但是交换应该比向/从数组中添加/删除更快:

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;
}
于 2013-07-02T05:48:48.327 回答