• 洗牌算法


    网站模块化项目第一期终于在加班75天后完成了。

    接下去要多看书还要多看娃

    项目需求数组随机排序

    洗牌算法

    数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):

    是一种将有限集合的顺序打乱的一种算法

    首先是一种常见的错误随机排序

    为什么是错误的排序我也是看了一篇文字

    链接:https://gold.xitu.io/entry/573164cc1ea4930064f70b01

    比较常见的用法  递归的方法来处理

    underscore.js 中的 shuffle 方法

    原理

    定义一个数组(shuffled),长度(length)是原数组(arr)长度
    取 0 到 index (初始0) 随机值 rand, shuffled[index] = shuffled[rand],

    shuffled[rand] = arr[index]
    index++ ; 重复第二步,

    直到 index = length -1
    就是 shuffled 从 0 到 length-1 的赋值过程,并且新加入的值是 arr[index],shuffled[index] 的值是已赋值的元素中随机值shuffled[rand],因为这样会有两个重复的值,所以 shuffled[rand] 就等于新加入的值 arr[index]

     第三种 使用临时变量保存  

    Knuth-Durstenfeld Shuffle

    Fisher-Yates 洗牌算法的一个变种是 Knuth Shuffle

    每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从 Fisher 算法的 O(n2)提升到了 O(n)

    1. 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
    2. 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
    3. 重复第 1 2 步,直到剩下1个元素为止
    function shuffle(arr){
        var length = arr.length,
            temp,
            random;
        while(0 != length){
            random = Math.floor(Math.random() * length)
            length--;
            // swap
            temp = arr[length];
            arr[length] = arr[random];
            arr[random] = temp;
        }
        return arr;
    }
  • 相关阅读:
    javascript入门篇(一)
    vue开发项目详细教程(第一篇 搭建环境篇)
    node基础03:使用函数
    node基础02:第一个node程序
    node基础01:简要介绍
    mac基本用法
    ES5基础01:正则表达式
    php基础11:运算符
    H5(一):使用formData对象模拟表单
    HTTP基础(一):如何使用浏览器network查看请求和响应的信息
  • 原文地址:https://www.cnblogs.com/h5monkey/p/6289222.html
Copyright © 2020-2023  润新知