我有一个Car对象的ArrayList,我想随机选择其中两个并比较它们。一旦我们对它们进行比较,我就希望将劣质汽车拆下来#34;从被随机挑选。我不认为我们可以阻止特定数字生成,所以我想到了其他一些想法。
以下是我一直在思考的一些事情:
Idea 1:
Include a "seen" attribute for each Car, set to false.
Generate two random integers from 0 to size of Car List.
Check to make sure two indexes are not seen.
Check to make sure that two integers are not the same, if they are, regenerate and repeat.
Grab cars using the two indexes generated.
If not seen, compare and flag the inferior as seen.
If seen, store that cars index in a seenIndex array.
Idea 2:
Create a copy (would a deep copy be required here, im thinking no?) of the list of Cars.
Generate two random numbers, confirm they're not the same.
Compare cars, remove the inferior car from the copyList.
Repeat.
我倾向于想法2,但如果有的话,我会喜欢听到更优雅的解决方案。
答案 0 :(得分:2)
正如其他人所说的那样,想法#1虽然可行,但对于大小合适的汽车列表来说是不可行的。
我会选择2
关于确认2个随机#s不尽相同的一件事 - 我建议你不要创建另一个随机数,而是要做到这一点:
Random rnd = new Random()
int rand1 = rnd.nextInt(copyList.size() - 1);
int rand2 = rnd.nextInt(copyList.size() - 2);
if(rand2 >= rand1) rand2++;
这可以避免创建一个可能与您必须更换的随机数相同的随机数,并且可以使您的程序更快。
然而,如果你只想弄清楚哪辆车更好,你可以迭代一个Car类的数组(或列表),将每一个比较到当前最好的(其中汽车是一系列汽车和getPoints( )返回汽车有多好):
int bestIndex = 0;
// Loop starts at 1 b/c we don't need to compare index 0 w/ 0
// i.e. # of comparisons is 1 minus the # of Cars
for(int i = 1; i < cars.length - 1; i++){
if(cars[i].getPoints() > cars[bestIndex].getPoints()){
bestIndex = i;
}
}
这将保留阵列并有效地找到最好的汽车。这当然可以修改为列表。
答案 1 :(得分:1)
我的建议2是一个非常直接的方法,我会推荐。
唯一要改变的是复制arraylist不需要是深层复制。这是因为使用浅拷贝(较便宜),从一个列表中删除项目对另一个列表没有影响。
您绝对不想跟踪 indeces 的使用情况,如其他答案所示。
这个math post解释了为什么另一个答案是个坏主意。数学并没有直接转换到这个例子,因为有多个目标数(除了最后一次迭代),但是在命中之前仍有很大的预期尝试次数,特别是当你从较大的列表开始时汽车。
答案 2 :(得分:0)
或者,您可以将随机生成的数字存储在arraylist中,然后每次生成新的随机数时,您可以先检查数组,如果不包含,则可以选择它。你可以这样做:
public int generateRandomNumber(int start, int end, ArrayList<Integer> excludedNumbers) {
Random rand = new Random();
int range = end - start + 1;
int random = rand.nextInt(range) + 1;
while(excludedNumbers.contains(random)) {
random = rand.nextInt(range) + 1;
}
return random;
}