发表于: 2017-06-09 00:28:24

6 1135


今天完成的事情:

1、基本上完成了js2的代码,由于昨天在看书和看视频,任务方面也就没什么进展,所以就没写日报。

明天计划的事情:

1、学习js2的任务深度思考。

2、修改关于js2任务的代码。

3、开始js3任务。 
遇到的问题:

1、下面是我关于玩家数量输入框的代码

<form class="input-container">
       <label>
       请输入玩家数量<input type="text" class="input" value="" id="input"><span class="text">玩家数量为4-18</span>
      </label>

</form>

var input1 =document.getElementById("input");
  input1.value =6;

我这样写代码 输入框里面出现数字6.

这次这样该,却没有显示,改成字符串 '4' 也不行,通过js断点调试里面查看,input1为4,可是不懂为什么输入框里面没出先4??


2、关于js数组乱序的

先是在网上查了一个最基本的方法


可是网上说用这个函数,不能公平的洗牌;下面是得到的结果

这个洗牌规则实现的原理是,我们知道Math.random() 返回的是一个[0,1)的随机数值 即这个数大于等0小于1,

对于数组的sort()方法来说,传入的数值的正负,就决定数组里面项的排序,假如这个随机数<0.5,这个时候是升序排列,这个随机数>0.5这个时候是降序排列,

由上面的console.log可以看出,随机并不是很均匀,因为前几个数几乎都是小于5的尤其第一个数就一个大于5的,这种洗牌方式明显不公平。

后来从网上搜索:

var arr=[1,2,3,4,5,6,7,8];
function shuffle(array) {
var length=array.length;
   var shuffled= Array(length);
   for(var index=0,rand;index <length ;index++){
   rand=parseInt(Math.random()*(index+1));
       shuffled[index]=shuffled[rand];
       shuffled[rand]=array[index];
}
return shuffled;
}
shuffle(arr);
console.log( shuffle(arr));

这个方法取得数组乱序得到的结果比较公平。

来分析下这个函数,对于这个函数传入一个数组,就是我们的玩家数组

1、取得数组的长度赋值给变量length。2、创建一个新数组shuffled,而且与传入的数组长度一样,因为这个shuffled是用来放乱序后的数组。

3、创建一个for循环,这是个从前往后遍历元素的方式,index从0开始知道length-1,对于变量rand来说,parseInt()接受一个值,返回数值,它会忽略所有的非数字字符,例如parseInt(22.5)得到22 parseInt(Math.random()*(index +1)) 得到是一个整数。

4、shuffled[rand]的值赋值给shuffled[index] 然后shuffled[rand]会得到array[index]的值。 在这个循环中,第一次循环,rand只能为0,而shuffled[0]=1;第二次循环,rand可能为0或者1,假如rand值为0

shuffled[1]=shuffled[0],此时数组值前两项都为1,然后shuffled[0]=array[1];此时数组值前两项为2、1;假如rand值为1,shuffled[1]=shuffled[1]=undefined,然后shuffled[1]=array[1]=2,此时数组前两项为1、2 综上所示,当index=n时, rand的值就有n中可能,而index值却是从[0,n-1]递增。

 shuffled[index]=shuffled[rand];
  shuffled[rand]=array[index];

而经过这两个表达式后,shuffled数组每一项都不同。恰恰说明函数能够实现数组乱序。我词穷也解释不清楚,大家可以用js断点调试下,就能很好的明白我说的意思了。

每一次循环都很清楚。


收获:

1、关于数组乱序。

数组乱序。给你一个数组,将其打乱,返回新的数组,即为数组乱序,也称为洗牌问题。
一个好的方案需要具备两个条件,一是正确性,毋庸置疑,这是必须的,二是高效性,在确保正确的前提下,如何将复杂度降到最小,是我们需要思考的。
其实它的思想非常的简单,遍历数组元素,将其与之前的任意元素交换。因为遍历有从前向后和从后往前两种方式,所以该算法大致也有两个版本的实现。
从后往前的版本:
function shuffle(array) {
  var _array = array.concat();
 
  for (var i = _array.length; i--; ) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = _array[i];
    _array[i] = _array[j];
    _array[j] = temp;
  }
  
  return _array;
}
从前往后
function shuffle(a) {
  var length = a.length;
  var shuffled = Array(length);
 
  for (var index = 0, rand; index < length; index++) {
    rand = parseInt(Math.random() * (index + 1));
    if (rand !== index) 这一行要不要都行
      shuffled[index] = shuffled[rand];
    shuffled[rand] = a[index];
  }
  return shuffled;

}

我采用就是第二种方法,也测试过第一种方法确实可行。





返回列表 返回列表
评论

    分享到