function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
像这样使用:
var arr = [2, 11, 37, 42];
arr = shuffle(arr);
console.log(arr);
答案 0 :(得分:0)
第一行实际上只是写出三个变量的简写:
所以,这个:
_data = factory.defaultCalendar;
转换为:
var currentIndex = array.length, temporaryValue, randomIndex;
答案 1 :(得分:0)
将其分成几部分。我们假设数组长度为n
。
我们从currentIndex = n
开始,我们将一直持续到currentIndex = 0
,这意味着所有元素都已经迭代并以概率移动到某个位置。
进入循环,第一行有两个函数
Math.random()
:在range [0, 1)
中生成随机实数。是的它在1开放,因此它不会产生1个Math.floor()
:给出作为参数现在观察,Math.random()*currentIndex
将在range [0, n)
(基本乘法)中生成一个随机数。 Math.floor()
将取整数部分,因此我们将在{0, 1, 2, ... n-1}
之间有一个整数。该值为randomIndex。
现在我们只是在currentIndex和randomIndex上交换数字。我们从最后开始为所有元素执行此操作。所以数组被洗牌了。
然而,这并不是一个非常好的混洗算法,因为每次迭代都会减少随机性的范围。更好的洗牌方法是将数字成对地与随机数绑定,然后将这些绑定的随机数作为关键字排序,并删除它们以使原始的数字数组洗牌。
答案 2 :(得分:0)
var currentIndex = array.length, temporaryValue, randomIndex;
一个变量中没有3个值,只有3个变量声明,其中一个初始化,其他变量undefined
。更好地格式化代码:
var currentIndex = array.length,
temporaryValue,
randomIndex;
while (0 !== currentIndex) {
// ...
currentIndex -= 1;
// ...
}
currentIndex从array.length
转到0
,因此array.length
次迭代
randomIndex = Math.floor(Math.random() * currentIndex);
从0
到currentIndex - 1
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
交换位置randomIndex
和currentIndex
的元素。
这应该为您提供理解此代码的基础知识。
答案 3 :(得分:0)
<p id="result">
<script>
var arrayList= ['a','b','c','d','e','f','g'];
arrayList.sort(function(){
return 0.5 - Math.random()
})
document.getElementById("result").innerHTML = arrayList;
</script>