0

我有一个长度为 10 的数组,例如:

Population = {1,3,4,2,7,-2,0,8,9,5}.

我生成了两个介于 0-9 之间的随机数(例如 4 和 6)。然后我检查第 4 和第 6 个元素 (7, 0),“获胜者”是更大的数字。所以 7 进入了获胜者数组(总共 5 名获胜者):

Winners = {7, ...}

每次我想将剩余的两个数字(包括失败者)配对并将获胜者放入获胜者数组中。

最简单的方法是使用大小为 n 的非固定大小数组并从“人口”中删除获胜者并将其放入“获胜者”中。然后我可以生成 1 和 n-1 之间的两个随机数并继续该过程。

我如何在 Java 中使用固定大小的数组来做到这一点?我怎么能从我的数组中选择两个数字,而忽略任何“赢家”的数字?

4

4 回答 4

1

如果您想使用固定大小的数组,那么每次选择获胜者(比如说ith position)时,您都必须遍历数组并将所有具有索引的元素移动j=i+1j,然后生成下一个随机数0 to n=n-1

虽然我建议在这里使用简单的数据结构是ArrayList. 您可以从中动态删除元素并将其size()用作上限来计算随机数。

于 2015-02-04T16:57:43.943 回答
1

您可以确定获胜者,然后将其交换到数组的后面:

int[] population = {1,3,4,2,7,-2,0,8,9,5};
private void turnament() {
    for (int i = population.length - 1; i >= population.length / 2; i--) {
        //you might want to make sure m != n.
        int m = (int) Math.round(Math.random() * i);
        int n = (int) Math.round(Math.random() * i);
        int temp = population[i];
        if (population[m] > population[n]) {
            population[i] = population[m];
            population[m] = temp;
        } else {
            population[i] = population[n];
            population[n] = temp;
        }
    }
}

这将进行population.length / 2比赛并将获胜者写在后面,因此最后一个元素将是第一个获胜者,倒数第二个是第二个获胜者,依此类推。

或者正如@Aniket Thakur 提到的那样,这ArrayList将是一个很好的数据结构。

于 2015-02-04T16:59:04.040 回答
0

使用标准数组,您可以实现一种随机队列。

基本上,您的队列是人口数组;当您选择两个对手时,您将它们的索引设置为null并将nulls 移动到数组末尾,同时减少可用大小。一些伪代码来澄清:

1 population = [...]
2 winners = [all null here, size probably half of population.length + 1]
3 size = popoluation.length
4 opponents = nextTwoRandoms(size)
5 population[opponents.0] = null
6 population[opponents.1] = null
7 winners = addWinnerBetween(opponents)
8 population = moveNullAtTheEnd(population)
9 size = size - 2
10 repeat from step#4 until satisfied
于 2015-02-04T17:20:50.800 回答
0

保持一个索引指向您的获胜者数组的开始位置(假设您重用该数组)。最初,它将是 n。然后用 Random.nextInt(startOfWinners) 得到 2 个随机数,用 n-1 交换获胜者并迭代。

于 2015-02-04T16:59:19.803 回答