简单说说随机打乱数组的方法

把一个数组随机打乱这个需求来源可能就是“洗牌”,所以我们常常称之为洗牌问题。这个问题实现并不复杂,有不少方法可以完成。与其他算法不同,洗牌问题不仅追求速度,还要求“洗得足够开”。今天只想写篇短的,只分享两种比较有代码性的洗牌方法。至于这些方法能不能真正将数组随机打乱,我们下次再讲。

方法一,随机排序法:

  1. function shuffle(array) {
  2. array.sort(function() {
  3. return Math.random() - 0.5;
  4. });
  5. return array;
  6. }

在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1048.htm 

使用javascript的sort方法,让任意两个元素的大小关系随机,从而达到随机打乱数组的目的,非常简单。

方法二,Fisher-Yates shuffle算法

  1. function shuffle(array) {
  2. var rand;
  3. var shuffled = [];
  4. var value;
  5. for(var i = 0; i < array.length; i++){
  6. rand = Math.floor(Math.random() * (i + 1));
  7. value = array[i];
  8. shuffled[i] = shuffled[rand];
  9. shuffled[rand] = value;
  10. }
  11. return shuffled;
  12. }
 

 在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1049.htm

 相比第一个算法,这个方法稍微复杂一点,但也很好理解。每次从原数组里取出一个数放到新数组里,但放的时候随机从新数组里找一个值交换一下位置。这个算法很有名,很常用。了解更多

不过并非所有的算法都能正真达到随机打乱,很有可能有些元素出现在各们位置的概率有偏差。那么如何分析这个随机过程,以及各种算法的表现怎么样,下次再说吧。

 原文链接:http://www.gbtags.com/gb/share/5646.htm

原文地址:https://www.cnblogs.com/gbtags/p/4624044.html