发表于: 2018-05-21 21:09:18

1 558


今天完成的事情:在js1的边缘试探,慢慢前行。理解一点是一点。

明天计划的事情:先写3个盒子,理解一下

开始颜色闪动

1.首先清除之前的闪动效果,及将所有颜色恢复

2.取出相应要闪动的节点,并设置颜色

这里要用到setInterval()函数

因为该函数会不停的调用,所以在里面放一个begin值,点击 开始跟结束 来控制这个值,这个值为true时才执行,

不能用while(),这样会崩溃。(事件一直在执行,无法执行其他)

setAttribute只能对html的属性进行设置,

lightbox.setAttribute("background-color",getRandomColor());

而要改变css样式,如果不用jQuery,就要这么写

lightbox.style.backgroundColor=getRandomColor();

遇到的问题:如何取三个不同的随机数? 

回答:通过洗牌算法获得不从复的随机数组,也可以使用逻辑判断选取不同的随机数方法类似数组乱序,定义一个新的空数组,把原数组中随机取得的元素添加到新的数组中,并且在原数组中删除已经获取的元素,循环三次返回新的数组,数组中就是随机获取的三个不重复的数值。functionnumrandom(){varblocks=[0,1,2,3,4,5,6,7,8];varnewblock[];varrunNum=3;for(k=0;k<runNum;k++){varran=Math.round(Math.random()*(blocks.length-1));newblock.push(blocks[ran]);blocks.splice(ran,1);}returnnewblock;}

收获:看了看洗牌算法。

洗牌算法

我们都多多少少学过几种排序,常见的几种排序大类有插入排序,希尔排序,选择排序,交换排序然而,洗牌算法的目的是将有序的数组进行打乱

一般的洗牌算法

1、利用一个队列

2、每次从数组中,随机找到一个数;若该数没有被选择过,那么就将它放入队列中;如果被选择过,就重新随机毋庸置疑,这个算法是可以满足洗牌的要求的然而呢,让我们看一下该算法时间复杂度每次选择一个数,可能存在已经选择过的情况所以该算法的时间复杂度是O(N* N)并且又多用到了一个队列,空间复杂度也不是很好

更优的洗牌算法

该算法类似于插入排序从数组的最后一个数(下标为i)开始,进行随机取余(除数为i+1,确保下标不过界)将得到的下标对应的元素和最后一个数交换将最后一个数不在视为数组中的元素,继续循环直到只剩下第一个元素为止


精华:洗牌算法有很多种,我个人比较喜欢这种,例子for(vari=people.length;i--;){//数组乱序从后往前版本varj=Math.floor(Math.random()*(i+1));vartemp=people[i];people[i]=people[j];people[j]=temp;简单说就是,让数组中的所有元素都与数组中的其他元素至少交换一次位置,我觉得这种算法比较好理解。


返回列表 返回列表
评论

    分享到