2017-08-22 161 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如果你关心的插入顺序)。