2017-08-22 6 views
0

Frameworkの生成:Javaの乱数生成器は、重複

public static List<Integer> buttonIdList = new ArrayList(); 

public void myMainMethod() { 
    for(Integer i = 0; i < 11; i++) { 
     int randomButtonId = getUniqueIdNumber(); 
    } 
} 

private static Integer getUniqueIdNumber() { 
     Random ran = new Random(); 
     int randomButtonId = ran.nextInt(20) + 1; 

     if(buttonIdList.contains(randomButtonId)) { 
      getUniqueIdNumber(); 
     } else { 
      buttonIdList.add(randomButtonId); 
     } 

     return randomButtonId; 
    } 

コードが重複を検出すると、それは(再帰的に)自分自身を呼び出しをして番号が一意である場合は2回目の試行でreturn文はmyMainMethodにそれを返しますか、 getUniqueIdNUmberに?

返品明細はどこに置かれるべきですか?

+1

番号が1から20のコレクションを生成し、要件が一意の番号である場合はそれをシャッフルすることを検討する必要があります。 – Henrik

+1

@Henrikはい私はstackoverflowの質問のほんの少しでもそのオプションを見た。私は自分のコードでどこが間違っているのかを見たいと思っていました。 – codeinprogress

答えて

7

あなたは再帰呼び出しの結果を返す必要があります:

private static Integer getUniqueIdNumber() { 
    Random ran = new Random(); 
    int randomButtonId = ran.nextInt(20) + 1; 

    if(buttonIdList.contains(randomButtonId)) { 
     return getUniqueIdNumber(); 
    } else { 
     buttonIdList.add(randomButtonId); 
    } 

    return randomButtonId; 
} 

P.S.が、Random ran代わりに各再帰呼び出しに新しいRandomインスタンスを作成するstatic変数を作成する方が良いだろう。

private static Random ran = new Random(); 
private static Integer getUniqueIdNumber() { 
    int randomButtonId = ran.nextInt(20) + 1; 
    if(buttonIdList.contains(randomButtonId)) { 
     return getUniqueIdNumber(); 
    } else { 
     buttonIdList.add(randomButtonId); 
     return randomButtonId; 
    } 
} 

そして、あなたは(あなたが挿入順序を心配している場合やLinkedHashSet)数は、より効率的な既存の検索を行うためにHashSetbuttonIdListを変更することを検討することがあります。