等概率不重復(fù)的生成隨機(jī)數(shù)應(yīng)該是在平時(shí)開發(fā)中常見的,也是面試中常問的基礎(chǔ)之一。有多種實(shí)現(xiàn)方式,有人人都可以想到的,也有不容易想到的巧妙算法,那么當(dāng)有人問你哪個(gè)實(shí)現(xiàn)方式更好的時(shí)候你該怎么回答呢?回答巧妙的算法比普通算法好?答案顯而易見,首先要搞清楚應(yīng)用場景和要解決的問題。這樣才能判斷一個(gè)算法或者方案的合適與否。
接下來明確問題、提出多個(gè)解決方法,最后對(duì)比每個(gè)方法的優(yōu)劣與使用場景。
要求:
可能有些具體的場景和問題需求都不一樣,可以統(tǒng)一:在一定范圍內(nèi)等概率不重復(fù)的生成有限個(gè)隨機(jī)數(shù)。具體的可以定義為,在[m,n]之間等概率的生成k個(gè)不相同的隨機(jī)數(shù)。
設(shè)計(jì)與實(shí)現(xiàn):
1.排重
一個(gè)最簡單的想法就是先生成再排重,直到生成k個(gè)隨機(jī)數(shù)為止。把所有用到排重的算法都可以歸為一類,包括利用Map、Set、BitMap、數(shù)組下標(biāo)去重的都算。因?yàn)楸举|(zhì)上是一樣的,可能在排重的時(shí)候有些優(yōu)化。
public List<Integer> random1(int m, int n, int k) { if (k < 1 || k > n-m+1) { &nb