如何随机化(随机播放)JavaScript数组?

跟風遠走 提交于 2019-12-11 19:26:04

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

我有一个像这样的数组:

var arr1 = ["a", "b", "c", "d"];

如何随机/随机播放?


#1楼

一个人可以(或应该)将其用作Array的原型:

来自ChristopheD:

Array.prototype.shuffle = function() {
  var i = this.length, j, temp;
  if ( i == 0 ) return this;
  while ( --i ) {
     j = Math.floor( Math.random() * ( i + 1 ) );
     temp = this[i];
     this[i] = this[j];
     this[j] = temp;
  }
  return this;
}

#2楼

这是Durstenfeld shuffle的JavaScript实现, Durstenfeld shuffle是Fisher-Yates的计算机优化版本:

/**
 * Randomize array element order in-place.
 * Using Durstenfeld shuffle algorithm.
 */
function shuffleArray(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

Fisher-Yates算法的工作原理是为每个原始数组元素选择一个随机元素,然后从下一个绘制中将其排除。 就像从一副纸牌中随机挑选一样。

这种排除方法是巧妙的方法(由Durstenfeld发明,供计算机使用),方法是将选择的元素与当前元素交换,然后从其余元素中选择下一个随机元素。 为了获得最佳效率,循环会向后运行,从而简化了随机选择(它始终可以从0开始),并且由于没有其他选择,它会跳过最后一个元素。

该算法的运行时间为O(n)。 请注意,随机播放是就地完成的。 因此,如果您不想修改原始数组,请首先使用.slice(0)对其进行复制。

更新到ES6 / ECMAScript 2015

新的ES6允许我们一次分配两个变量。 当我们要交换两个变量的值时,这特别方便,因为我们可以在一行代码中完成它。 这是使用此功能的相同功能的缩写。

function shuffleArray(array) {
    for (let i = array.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
}

#3楼

使用underscore.js库。 在这种情况下,方法_.shuffle()很合适。 这是该方法的示例:

var _ = require("underscore");

var arr = [1,2,3,4,5,6];
// Testing _.shuffle
var testShuffle = function () {
  var indexOne = 0;
    var stObj = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5
    };
    for (var i = 0; i < 1000; i++) {
      arr = _.shuffle(arr);
      indexOne = _.indexOf(arr, 1);
      stObj[indexOne] ++;
    }
    console.log(stObj);
};
testShuffle();

#4楼

添加到@Laurens Holsts答案。 这是50%压缩的。

function shuffleArray(d) {
  for (var c = d.length - 1; c > 0; c--) {
    var b = Math.floor(Math.random() * (c + 1));
    var a = d[c];
    d[c] = d[b];
    d[b] = a;
  }
  return d
};

#5楼

var shuffle = function(array) {
   temp = [];
   originalLength = array.length;
   for (var i = 0; i < originalLength; i++) {
     temp.push(array.splice(Math.floor(Math.random()*array.length),1));
   }
   return temp;
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!