2016-04-04 5 views
0

私はCarオブジェクトのArrayListを持っています。それらのうちの2つをランダムに選択して比較したいと思います。私たちがそれらを比較すると、私は下位の車を無作為に選んで「取り除く」ことを望む。特定の数字が生成されるのを止めることはできないと思うので、私は他の考えを考えました。2つのランダムな整数を生成し、それらが再び生成されないようにします。

は、ここで私が考えてきたいくつかのものです:

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に傾いていますが、私は1つが存在する場合は、よりエレガントな解決策を聞いてみたいです。

答えて

2

他の人は言ったように、アイデア#1はうまくいくものの、まともなサイズの車のリストでは実行可能ではありません。

:私は別の乱数を作成しないあなたに助言するのではなく、これを行うために - 私は2ランダム#Sはしかし同じではないことを確認する程度オプション2

の一つとなるだろう

Random rnd = new Random() 

int rand1 = rnd.nextInt(copyList.size() - 1); 
int rand2 = rnd.nextInt(copyList.size() - 2); 

if(rand2 >= rand1) rand2++; 

これにより、置換する必要のある乱数と同じである可能性のある乱数を作成することがなくなり、プログラムが大幅に高速化されます。

しかし、あなたが良い車を見つけようとしているだけなら、Carクラスの配列(またはリスト)を繰り返して、それぞれを現在の最良のものと比較することができます(carは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; 
    } 

} 

これは、配列を維持し、効率的に最高の車を見つけるでしょう。もちろんこれはリストのために変更することができます。

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; 
} 
1

あなたのアイデア2は私が推薦する非常に簡単なアプローチです。

変更する唯一のことは、コピーarraylistがディープコピーである必要はないということです。これは、浅いコピー(安価)では、あるリストから項目を削除しても、他のリストには影響がないためです。

あなたは間違いなく、indecesが使用されているかどうかを把握したくないという回答があります。
このmath postは、他の回答が悪い考えである理由を説明しています。数学はこの例に直接変換されませんが、複数のターゲット番号があるため(最後の反復を除いて)、ヒットする前に試行回数が多くなります。 。

関連する問題