首先看到这个题目,很多人的第一感觉就是使用 Random 随机类,循环生成随机数。也就是我原来写过的一篇文章java之生成不重复的随机数里面的代码,如下图:
这段代码可以生成size个begin到maxNum范围内的随机数,并且不会重复。看起来似乎没有什么问题,仔细审题就会发现题目是要求稳定的时间复杂度的。那么上图中的代码的隐患就在于Random 中的 nextInt 方法,如果它循环时多次产生重复的随机数,就会导致它的时间复杂度不是稳定的。
现在问题发现了,那么我们如何解决呢?很显然,nextInt 方法是jdk中的代码,而且它作为随机数的生成,从概率上讲,循环时多次生成相同的随机数理论上来说也是合理的。所以我们必须要换一种思维方式,不能以随机数为主,只能以随机数为辅。
1.随机打乱法
public class TestRandom {
public static void main(String[] args) {
System.out.println(getRandomNum(5,100));
}
public static List<Integer> getRandomNum(int start, int end){
List<Integer> list=new ArrayList<>();
for(int i