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