发表于: 2019-04-18 20:47:23
1 798
今天完成的事情:今天又看了看洗牌算法。然后差不多理解了洗牌算法怎么用
let Arr = [0,1,2,3,4,5,6,7,8];
//以下随机抽三个数,原理就是将数组元素互换位置,从而打乱数组原来的顺序,再利用slice提取。
function randomArray(arr, count) {//myFunction(var1,var2),调用函数时,参数可以在函数中使用。您可以发送任意多的参数,由逗号 (,) 分隔.//这一大段都是函数,(var1,var2)参数,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=1或0这个条件才不生效。
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
下面一起看看上面说的这个算法,代码如下:
收获:差不多会用洗牌算法了
评论