等概率不重复的生成随机数应该是在平时开发中常见的,也是面试中常问的基础之一。有多种实现方式,有人人都可以想到的,也有不容易想到的巧妙算法,那么当有人问你哪个实现方式更好的时候你该怎么回答呢?回答巧妙的算法比普通算法好?答案显而易见,首先要搞清楚应用场景和要解决的问题。这样才能判断一个算法或者方案的合适与否。
接下来明确问题、提出多个解决方法,最后对比每个方法的优劣与使用场景。
要求:
可能有些具体的场景和问题需求都不一样,可以统一:在一定范围内等概率不重复的生成有限个随机数。具体的可以定义为,在[m,n]之间等概率的生成k个不相同的随机数。
设计与实现:
1.排重
一个最简单的想法就是先生成再排重,直到生成k个随机数为止。把所有用到排重的算法都可以归为一类,包括利用Map、Set、BitMap、数组下标去重的都算。因为本质上是一样的,可能在排重的时候有些优化。
public List<Integer> random1(int m, int n, int k) { if (k < 1 || k > n-m+1) { &nb