一个数组打乱顺序,要求每个元素都不在原本的位置
看用的比较多的是洗牌算法?但是跑测试用例还是有可能某个元素没有变吧?
const fn=(arr)=>{ for(let i=arr.length-1;i>0;i--){ let j=Math.floor(Math.random()*(i+1)); [arr[i],arr[j]]=[arr[j],arr[i]] } return arr}
各位大神有什么好方法吗,算法实在是太烂...
洗牌算法通常是允许元素出现在原位置的。比如 Fisher-Yates 算法,每一轮中是将当前位置的元素和后面所有位置中的一个随机位置上的元素交换,这个随机位置允许是自己所在的位置,即偏移量为 0。如果在这个算法的基础上,把偏移量为 0 的位置去掉,那么是可以保证每个元素都不在原位置上的,比如下面这个演进图
参考:从数据集中随机抽取一定数量的数据
之前在网上看到过类似的讨论,所以这篇回答算是“搬运”的。本着尊重原创,尊重作者的原则,在回答的开头将博客的位置放出来:
世界最速の配列シャッフルアルゴリズム、Fisher-Yatesアルゴリズム
简单的说,这是一种稍微改进的洗牌算法,称为 Fisher-Yates 算法,使用了外部的随机数源来增加随机性,这个改进的算法使用了一个 random 函数来生成随机数,确保每一次的洗牌都可以获取一个新的随机数。
const fn = (arr) => { const random = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; for (let i = arr.length - 1; i > 0; i--) { let j = random(0, i); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr;};
相对于目前你提到的洗牌算法,随机性更高了一些。
问题 你想打乱数组中的元素。 解决方案 Fisher-Yates shuffle 是一种高效、公正的方式来让数组中的元素随机化。这是一个相当简单的方法:在列表的结尾处开始,用一个随机元素交换最后一个元素列表中的最后一个元素。继续下一个并重复操作,直到你到达列表的起始端,最终列表中所有的元素都已打乱。这 [ Fisher-Yates shuffle Visualization ]( http://b
我想比较两个数组的双打。使用香草JUnit,我可以:
问题内容: 这是我要使用的。.length方法对我尝试的任何操作均无效,因此我什至不知道从哪里开始。 问题答案: 您正在尝试遍历单个数组而不是字符串数组。更改 至 以便通过字符串列表循环,收集每个字符串和存储它诠释的,你以后。
问题内容: 我想比较两个双打数组。使用香草JUnit,我可以执行以下操作: 我想知道如何使用Hamcrest做到这一点,最好不要创建自定义Matchers(如果可能)。类似于对数组中的每个元素使用“关闭”匹配器。 问题答案: 如果更改为a,则可以使用以下辅助方法: 您也可以使用原始数组来完成此操作,但是您将需要一个自定义匹配器。
我被分配了一项编程任务,但我被卡住了。其说明如下: 有一个名为“秘密圣诞老人”(给他们礼物)的游戏,有很多孩子参加。对于每个参与的孩子,都有一个来自参与孩子的秘密圣诞朋友。我必须编写一个程序,为每个参与的孩子挑选一个秘密的圣诞老人朋友。 示例:如果Bob,Alice,John和George是参与的孩子,在随机选择之后, 输出可能看起来像 具有相同输入的连续两次程序运行不应有相同的结果。 我的想法是