今天給大家分享一下:洗牌算法具體指的是什么。
一、背景介紹
洗牌算法是我們常見的隨機問題,在玩游戲、隨機排序時經常會碰到,本質是讓一個數組內的元素隨機排列。類似于洗牌,將所有牌的位置打亂,讓他們隨機出現在任何位置。
二、知識剖析
洗牌算法的原理是什么?
方法一:
從牌堆里隨便抽一張出來,然后放在一邊,之后從剩下的牌里重復之前的操作,直到所有牌都被抽出來放到了另一堆中。抽象到代碼世界,按相同的做法,就是隨機從數組里取出一個元素,保存到另一個數組,然后重復之,直到原數組中所有元素都處理掉。
我們創建了一個copy數組,然后遍歷目標數組,將其元素復制到copy數組里,同時將該元素從目標數組中刪除,這樣下次遍歷的時候就可以跳過這個序號。
方法二:
隨機從數組中抽出一個元素,然后與最后個元素交換,相當于把這個隨機抽取的元素放到了數組最后面去,表示它已經是被隨機過了,同時被換走的那個元素跑到前面去了,會在后續的重復操作中被隨機掉。一輪操作過后,下一輪我們只在剩下的n-1個元素也就是數組的前n-1個元素中進行相同的操作,直到進行到第一個。
shuffle函數掛載在Array對象的原型之下,便于數組直接調用該函數。在shuffle函數內部,this引用的就是調用該shuffle的數組。用一個新的變量引用this,也就是調用shuffle函數的數組。接下來的for循環用于遍歷所有數組內的所有元素,并進行隨機交換。注意,遍歷順序是從后往前進行的,也就是說從input.length-1位置的元素開始,知道遍歷到數組中的第一個元素。遍歷過程中的位置由變量i指定。接下來,使用了兩行代碼在指定范圍內挑選一個隨機元素。 變量randomIndex存儲了一個隨機數,該隨機數可以用作數組的索引,進而提取一個隨機元素。注意,該隨機數的最大值并不是數組的長度,而是變量i的值。確定了隨機元素的索引之后,用新的變量保存該元素的值,然后交換選中元素和隨機元素的值。
三、常見問題
洗牌算法是否真的實現了完全隨機?
四、解決方案
五、編碼實戰
六、拓展思考
1 、還有什么比較實用的亂序方法?
? ? ? ?利用sort函數 :? ? ? ? arr.sort(function(){ return 0.5-Math.random()});
一行代碼就可以實現,相對而言比較簡單,但是他并不能實現真正意義的隨機。
參考一:www.w3cplus.com/javascript/shuffling-array-js.html? ? ? ?
參考二:http://www.cnblogs.com/Wayou/p/fisher_yates_shuffle.html
參考三:http://blog.jobbole.com/64897/
參考四:http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html
1 各種洗牌算法的效率比較:比較代碼執行鏈接
鳴謝
感謝觀看
BY聶義中
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。