发表于: 2020-07-29 23:37:23

0 1386


1、背景介绍

     洗牌算法随机打乱一个数组中的元素的顺序,是编程中的一个常见的需求。它是一个比较形象的术语,本质上让一个数组内的元素随机排列。举个简单的例来说,当数组长度为 9,数组内元素的值顺次分别是 1~9,我们要做的 就是打乱数组内元素的顺序



2.知识剖析

    洗牌算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法非常高效且生成的随机排列是等概率的。

  

 Fisher–Yates shuffle 洗牌算法

      Fisher–Yates shuffle 算法是一个用来将一个有限集合生成一个随

     机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的。同时这个算法非常高效。





3.常见问题

洗牌算法具体是如何实现的?

4.解决方案

假如你要洗牌,那么最随机的做法无疑是从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。


5.编码实战

在同一个元素中定义了id和class,由于id优先级高于class,所以显示的是id属性。

5.编码实战

1、Fisher–Yates shuffle算法

Array.prototype.shuffle = function() {

 var input = this;

for (var i = input.length-1; i >=0; i--) {

 var randomIndex = Math.floor(Math.random()*(i+1));

var itemAtIndex = input[randomIndex];


input[randomIndex] = input[i];

input[i] = itemAtIndex;

}

return input;

}


2、sort()算法

var arr = [1,2,3,4,5,6,7,8,9,10];

rr.sort(function(){

return Math.random() - 0.5;

})

console.log(arr);



3、Knuth-Durstenfeld Shuffle算法

function KdShuffle(arr){

var len = arr.length,

i,temp;

 while(len){

i = Math.floor(Math.random() * len--);

temp = arr[i];

 arr[i] = arr[len];

arr[len] = temp;

}

return arr;

}



6.扩展思考

这个三种算法之间有哪些不同点呢

1、Fisher–Yates算法在原理上保证了不会出现浪费次数,是一个非常高效又公平的随机排序算法,如果有随机排序数组的需求,可以选择它

2、sort()算法最简洁但不推荐 不是真正意义上的完全乱序

3、Knuth-Durstenfeld Shuffle方法是一种in-place的置换方法,节省空间,性能也好,随机性好。

7.参考文献

参考一:知乎

参考二:三种洗牌算法shuffle



返回列表 返回列表
评论

    分享到