把一个数组随机打乱这个需求来源可能就是“洗牌”,所以我们常常称之为洗牌问题。这个问题实现并不复杂,有不少方法可以完成。与其他算法不同,洗牌问题不仅追求速度,还要求“洗得足够开”。今天只想写篇短的,只分享两种比较有代码性的洗牌方法。至于这些方法能不能真正将数组随机打乱,我们下次再讲。
方法一,随机排序法:
- function shuffle(array) {
- array.sort(function() {
- return Math.random() - 0.5;
- });
- return array;
- }
在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1048.htm
使用javascript的sort方法,让任意两个元素的大小关系随机,从而达到随机打乱数组的目的,非常简单。
方法二,Fisher-Yates shuffle算法
- function shuffle(array) {
- var rand;
- var shuffled = [];
- var value;
- for(var i = 0; i < array.length; i++){
- rand = Math.floor(Math.random() * (i + 1));
- value = array[i];
- shuffled[i] = shuffled[rand];
- shuffled[rand] = value;
- }
- return shuffled;
- }
在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1049.htm
相比第一个算法,这个方法稍微复杂一点,但也很好理解。每次从原数组里取出一个数放到新数组里,但放的时候随机从新数组里找一个值交换一下位置。这个算法很有名,很常用。了解更多
不过并非所有的算法都能正真达到随机打乱,很有可能有些元素出现在各们位置的概率有偏差。那么如何分析这个随机过程,以及各种算法的表现怎么样,下次再说吧。