发表于: 2019-04-18 20:47:23

1 799


今天完成的事情:今天又看了看洗牌算法。然后差不多理解了洗牌算法怎么用

let Arr = [0,1,2,3,4,5,6,7,8];
//以下随机抽三个数,原理就是将数组元素互换位置,从而打乱数组原来的顺序,再利用slice提取。
function randomArray(arr, count) {//myFunction(var1,var2),调用函数时,参数可以在函数中使用。您可以发送任意多的参数,由逗号 (,) 分隔.//这一大段都是函数,(var1var2)参数,A代表数组,B代表所需要随机数的个数。
   var shuffle = arr.slice(0), i = arr.length, min = i - count, temp,index;//shuffle:洗牌,代表表示新数组//slice(单值)是提取字符串中第几到字符串结束//.length字符串的长度//CD作用起转换数值。
   while (i-- > min) {//i-1的值小于min的值,自我感觉这个条件没有,可以舍弃,除非B=10这个条件才不生效。
       index = Math.floor((i + 1) * Math.random());//获取整数//Math.floor(x)向下取整计算,它返回的是小于或等于函数参数//Math.random()返回介于 0 (包含) ~ 1(不包含) 之间的一个随机数。
       temp = shuffle[index];//获取数组中的数//C的值是S数组的第D个数(从0开始计数)
       shuffle[index] = shuffle[i];//S数组的第D个数的值替换成S的第i个数值。此时S数组发生第一次变化,这是有两个相同的值//S[i]数组中最后一个数
       shuffle[i] = temp;//S数组的第i个数的值替换为C
   }
   return shuffle.slice(min);//输入S数组的第min个开始到结束之间的数值
};
function randomColor(){
   var color="#";
   for(var i=0;i<3;i++){
       color += (Math.random()*16 | 0).toString(16);
   }
   return color;//输出16进制
}
function resetColor() {
   for (var i= 0; i < box.length; i++) {
       box[i].style.background = "orange";
   }
}//随机3个变完颜色后从新变为橙色
var time;
function start() {//开始按钮
   time = setInterval(function () {
       resetColor();
       var indexArr = randomArray(Arr,3);//随机取3个数
       for(var i = 0; i < indexArr.length; i++) {
           var color = randomColor();//随机取3个颜色
           box[indexArr[i]].style.background = color;
       }
   }, 1000);
   document.getElementById("start").disabled = true;//禁用开始按钮
}
//结束按钮
function end() {
   resetColor();
   clearInterval(time);
   document.getElementById("start").disabled = false; //启用开始按钮
}

明天计划的事情:明天计划开始写任务二的静态页面
遇到的问题:洗牌算法如何打乱数组的顺序

var shuffleArray = function(array) {
    var currentIndex = array.length;
    var temporary;
    var toIndex;
 
    while (currentIndex) {
        toIndex = Math.floor(Math.random() * currentIndex--);
        temporary = array[currentIndex];
        array[currentIndex] = array[toIndex];
        array[toIndex] = temporary;
    }
 
    return array;
}



假如有一个数组是这样子:

1
var arr1 = ["a", "b", "c", "d"];

如何随机打乱数组顺序,也即洗牌。

有一个比较广为传播的简单随机算法:

1
function RandomSort (a,b){ return (0.5 - Math.random()); }

实际证明上面这个并不完全随机。

随便一搜网上太多这种东西了,看一下stackoverflow上的一个高分回答,答案出自github上。

knuth-shuffle
The Fisher-Yates (aka Knuth) shuffle for Browser and Node.JS

下面一起看看上面说的这个算法,代码如下:


收获:差不多会用洗牌算法了


返回列表 返回列表
评论

    分享到