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

原文链接
 

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

方法一,随机排序法:

  1. function shuffle(array){
  2. array.sort(function(){
  3. returnMath.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值