zoukankan      html  css  js  c++  java
  • 简单说说随机打乱数组的方法

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

    方法一,随机排序法:

    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

  • 相关阅读:
    线段树(updata+query)
    铁轨(栈)
    困难的串(搜索)
    素数环(简单搜索)
    编码
    opencv + numpy for python
    PIL参考手册
    八数码问题
    三维地图(BFS)
    梯田(dfs)
  • 原文地址:https://www.cnblogs.com/gbtags/p/4624044.html
Copyright © 2011-2022 走看看