作家
登录

关于JavaScript的数组随机排序

作者: 来源: 2017-04-06 16:04:37 阅读 我要评论

]; 
  •  
  • let n = 10000; 
  •  
  • let count = (new Array(a.length)).fill(0); 
  •  
  •   
  •  
  • for (let i = 0; i < n; i ++) { 
  •  
  •     shuffle(a); 
  •  
  •     count[a.indexOf('a')]++; 
  •  
  •  
  •   
  •  
  • console.log(count); 
  • sort_03

    一次履行结不雅为:[ 1023, 991, 1007, 967, 990, 1032, 968, 1061, 990, 971 ]。多次验证,同时在这儿查看shuffle(arr)函数结不雅的可视化分布,可以看到,这个办法可以认为足够随机了。

    筹划二(Fisher–Yates shuffle)

    须要留意的是,膳绫擎的办法固然知足随机性请求了,但在机能上并不是很好,须要遍历几回数组,还要对数组进行splice等操作。

    考察Lodash 库中的 shuffle 算法,留意到它应用的实际上是Fisher–Yates 洗牌算法,这个算法由 Ronald Fisher 和 Frank Yates 于 1938 年提出,然后在 1964 年由 Richard Durstenfeld 改编为实用于电脑编程的版本。用伪代码描述如下:

    1. -- To shuffle an array a of n elements (indices 0..n-1): 
    2.  
    3. for i from n−1 downto 1 do 
    4.  
    5.      j ← random integer such that 0 ≤ j ≤ i 
    6.  
    7.      exchange a[j] and a[i] 

    一个实现如下(ES6):

    1. function shuffle(arr) { 
    2.  
    3.     let i = arr.length; 
    4.  
    5.     while (i) { 
    6.  
    7.         let j = Math.floor(Math.random() * i--); 
    8.  
    9.         [arr[j], arr[i]] = [arr[i], arr[j]]; 
    10.  
    11.     } 
    12.  

    或者对应的 ES5 版本:

    1. function shuffle(arr) { 
    2.  
    3.     arr.sort(() => Math.random() - 0.5); 
    4.  
    1. function shuffle(arr) { 
    2.  
    3.   var i = arr.length, t, j; 
    4.  
    5.   while (i) { 
    6.  
    7.     j = Math.floor(Math.random() * i--); 
    8.  
    9.     t = arr[i]; 
    10.  
    11.     arr[i] = arr[j]; 
    12.  
    13.     arr[j] = t; 
    14.  

    15.   推荐阅读

        智能数据湖势在必行

      由大年夜数据触发的数据驱动的做法是一种最好的懂得。如今,各个组织正在各类数据构造,格局和分布式地舆数据源地位等方面进行竞争,并在时光框架和数量上跨越了现有体系的才能。以往人们>>>详细阅读


      本文标题:关于JavaScript的数组随机排序

      地址:http://www.17bianji.com/lsqh/34614.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)