2017-08-22 232 views
0

框架: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; 
    } 

當代碼遇到重複,它調用本身(遞歸),並在第二次嘗試,如果該號碼是唯一的return語句返回給myMainMethod或獲取UniqueIdNUmber?

return語句應該放在哪裏?

+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一個static變量,而不是在每次遞歸調用創建一個新的Random實例。

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

,你可能會認爲,爲了使現有的數字更高效的搜索改變buttonIdListHashSet(或LinkedHashSet如果你關心的插入順序)。