首先来思考一个问题: 设计一个公平的洗牌算法 1. 看问题,洗牌,显然是一个随机算法了.随机算法还不简单?随机呗.把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可. 如果你的答案是这样,通常面试官会进一步问一下,k 应该取多少?100?1000?10000? 很显然,取一个固定的值不合理.如果数组中有 1000000 个元素,随机 100 次太少:如果数组中只有 10 个元素,随机 10000 次又太多.一个合理的选择是,随机次数和数组中元素大小相关.比如数组有多少个元素,我们就随…
384. 打乱数组 打乱一个没有重复元素的数组. 示例: // 以数字集合 1, 2 和 3 初始化数组. int[] nums = {1,2,3}; Solution solution = new Solution(nums); // 打乱数组 [1,2,3] 并返回结果.任何 [1,2,3]的排列返回的概率应该相同. solution.shuffle(); // 重设数组到它的初始状态[1,2,3]. solution.reset(); // 随机返回数组[1,2,3]打乱后的结果. sol…
Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码如下: void knuth() { ; i > ; i--) { ) + ; swap(a[i], a[id]); } } 由上述方法可知,每一张牌经过洗牌之后一定不会出现在原来位置,那么一共会有多少情况呢,这其实就是错排的定义,n个数的错排数有如下递推公式: f(n)=(n-1)(f(n-1)+…
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(Math.random() * (len - 1)); console.log("idx",idx); var temp = arr[idx]; console.log("temp",temp); arr[idx] = arr[len - i - 1]; console.…
对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一.Fisher–Yates Shuffle 算法思想就是从原始数组中随机抽取一个新的数字到新数组中.算法英文描述如下: Write down the numbers from 1 through N. Pick a random number k between one and the number…
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n-1]相当于矩阵下标对应的一维索引. (2)用一个arrays数组存放矩阵元素为1的索引.每次从 [0, n-1]取数,这个数可以表示矩阵元素的索引,如果取的数已经在这个数组里,说明这个索引对应的矩阵元素已经被flip为1了,则放弃,继续取数,直到取到的数不在数组里(对应的矩阵元素为0),就把取到的…
<Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很简单,就是像洗扑克牌一样,对一组数据进行随机打乱,这个算法在很多应用里都非常有用,特别是对于后面需要介绍的快排来说,这个算法直接影响了快排的效率. 洗牌的算法这里提了2种 排序洗牌 思想很简单,先对每个元素生成一个随机数,然后对这些随机数进行排序 排序前 排序后 Knuth洗牌 一个更简单的算法,不用sort…
点击上方"前端自习课"关注,学习起来~ 最近的一个塔罗牌项目中,有一个洗牌的需求,其实也就是随机打乱数组,遂网上搜了下,再此做个整理- 塔罗牌 举例来说,我们有一个如下图所示的数组,数组长度为 9,数组内元素的值顺次分别是 1~9: 1~9数组 从上面这个数组入手,我们要做的就是打乱数组内元素的顺序: 1~9数组打乱随机 代码实现 Array.prototype.shuffle = function () {     let input = this;     for (let i =…
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算法:如何随机化的布雷(二)之洗牌算法>.因为扫雷这个游戏我是写过的,具体见:<Python:游戏:扫雷>. 游戏开始的时候需要随机布雷.扫雷的高级是 16 × 30 的网格,一共有 99 个雷.如果从 0 开始给所有网格做标记,那么布雷的问题就成了从 480 个数中随机选取 99 个数.第一…
1.算法 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 简单的原理如下图所示: 2.原理 总结下,洗牌算法Fisher_Yates的原理就是把从1到n的顺序候选集随机打乱, 做法就是 第1次从1-n的候选集合随机选个数,拿出此数,并把它从候选集合剔除(候选集合n-1). 第2次从1-n-1的候选集合随机选个数,拿出此数,并把它从候选集合剔除(候选集合n-2). 第2次从1-n-2的候选集合随机选个数,拿出此数,并把它从候选集合…