【推荐】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;
};
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3141899