昨晚在家看 “南洋十大邪術”,又發現徐錦江了,果然是在情色片中起家的,起興處。。。被以前學校的一個小師弟抖屏攪了。。。悲劇!
由于金三銀四的好時期,小師弟也跑去找工作了,也就碰到了各種各樣的面試題,然後也就引出了今天的這篇博文,就是:如何産生1-100
之間的100個不重複的随機數,不過這裡還好,在攜程面試.net是沒有筆試的:-)
如果這是你是第一次看到這個題目,也許你的想法有很多。
1:首先從原始數組中随機選擇一個數字,然後将該數字從數組中剔除,再随記選,再剔除,重複99次,就解決了。
我們知道從數組中剔除一個元素的複雜度為o(n),那麼随機選取n個數字,它的複雜度就是o(n2)了。
2:用hash作為中間過濾層,因為在數組中,我們采用随機數的話,也許随機數在多次随機中可能會有重複,是以需要用hash來判斷一下,
如果在hash中重複,則繼續産生随機數,直到不重複為止,當然這個複雜度就不好說了,得要看随機數随機不随機了,好的話,o(n)搞定,
不走運的話無上限~
3:就像标題說的一樣,很多問題我們都能在現實生活中找到寫照,畢竟很多東西是來源于現實,又抽象于現實,比如這個題目在現實生活中,
可以對應到的就是“洗撲克牌”,在算法中也叫“洗牌原理”,我們知道洗撲克牌的方式就是随機的交換撲克牌的位置,又叫做"切牌",當你切了
很多次後,我們的撲克牌就可以認為是足夠亂了,複雜度也就變成了o(n),用代碼實作就是這樣的。
<1> 先有序的生成52張牌,然後有序的放到數組中。
<2>從1-52中随機的産生一個數,然後将目前次數的位置跟随機數的位置進行交換,重複52次,我們的牌就可以認為足夠亂了。
4:代碼實作
<1> 首先定義牌的資料結構,定義一個“花色”和“數字”
<2>有序的生成52張牌
<3> 然後就是切牌了,剛才也說了思路,就是拿随機數的位置與目前i的位置進行交換,不過一說到交換就想起了“冒泡排序”,可能被毒害太
深了(┬_┬),不知道你感覺到了沒。
<4> 最後我們看看效果