随机播放JavaScript数组

时间:2016-09-24 21:10:26

标签: javascript arrays shuffle

嗨伙计们。我正在制作一个记忆游戏,为了达到这个目的,我不得不以某种方式在Array中改变图像。我在Stack Overflow,Fisher-Yates shuffle上发现了一个旧的答案,并使用了它,它可以工作,但我不明白怎么做。有人可以一步一步地解释每个元素在此代码中表示的内容。特别是第一行,变量中有三个值。谢谢。

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);

4 个答案:

答案 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);

0currentIndex - 1

的随机数
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;

交换位置randomIndexcurrentIndex的元素。

这应该为您提供理解此代码的基础知识。

答案 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>