手机版

JS随机洗牌算法的数组随机排序

时间:2021-11-06 来源:互联网 编辑:宝哥软件园 浏览:

推荐阅读:添加、删除、修改、检查JavaScript学习笔记数组。

JavaScript学习笔记的数组求和方法。

随机排列的JavaScript学习笔记。

Shuffle算法是一个生动的术语,它本质上使数组中的元素随机排列。例如,我们有一个如下图所示的数组。数组的长度为9,数组中元素的值分别为1~9。

从上面的数组开始,我们需要做的就是打乱数组中元素的顺序:

代码实现

维基百科中的条目Fisher-Yates shuffle详细介绍了洗牌算法,下面演示的算法也是基于这个理论:

array . prototype . shuffle=function(){ var input=this;for(var I=input . length-1;I=0;I-){ var random index=math . floor(math . random()*(I ^ 1));var itemAtIndex=输入[random index];输入[random ndex]=输入[I];输入[I]=Itematindex;}返回输入;}var tempArray=[ 1,2,3,4,5,6,7,8,9,10]tempArray . shuffle();//结果是.警报(TempArray);在上面的代码中,我们创建了一个shffle()方法,用于随机排列数组中的元素。另外,我们在Array对象的原型下挂载这个方法,所以任何数组都可以直接调用这个方法:

var tempArray=[ 1,2,3,4,5,6,7,8,9,10]tempArray . shuffle();操作原理

阅读完代码后,让我们看看它对数组做了什么。首先,该方法选择数组的最后一个元素:

接下来,确定随机元素的范围,从数组的第一个元素到上一步中选择的元素:

确定范围后,从中随机选择一个数字。这里,假设随机选择的元素是4:

然后交换最后一个元素和随机选择的元素的值:

上述交换完成后,相当于对数组最后一个元素的随机处理。接下来,选择数组中倒数第二个元素:

由后向前处理的原因是便于确定随机选择的范围。这次我们假设随机元素是2:

然后交换倒数第二个元素和第二个元素的值,完成倒数第二个元素的随机排列。然后选择倒数第二个元素并重复前面的操作:

剩下的就是一些重复性的工作,不需要我介绍了。

分析代码

在前一节中,我们用一个图例演示了洗牌过程。让我们从代码本身来看洗牌的过程。让我们从洗牌功能开始:

array . prototype . shuffle=function(){ var input=this;for(var I=input . length-1;I=0;I-){ var random index=math . floor(math . random()*(I ^ 1));var itemAtIndex=输入[random index];输入[random ndex]=输入[I];输入[I]=Itematindex;}返回输入;} shuffle函数挂载在array对象的原型下,便于Array直接调用该函数。在shuffle函数中,这指的是调用shuffle的数组:

var输入=这个;在上面的代码中,我用一个新的变量来引用它,也就是调用shuffle函数的数组。接下来,看看在for循环中做了什么:

for(var I=input . length-1;I=0;I-){ var random index=math . floor(math . random()*(I ^ 1));var itemAtIndex=输入[random index];输入[random ndex]=输入[I];输入[I]=Itematindex;}此循环用于遍历所有数组中的所有元素,并随机交换它们。请注意,遍历顺序是从后到前,也就是说,从input.length-1位置的元素开始,我们知道我们遍历到了数组中的第一个元素。遍历期间的位置由变量I指定.

这里的变量I是上面图例中选定的元素:

洗牌算法

接下来,使用两行代码来挑选指定范围内的随机元素:

var random index=math . floor(math . random()*(I ^ 1));var itemAtIndex=输入[random index];变量randomIndex存储一个随机数,这个随机数可以作为数组的索引,然后可以提取一个随机元素。注意,这个随机数的最大值不是数组的长度,而是变量I的值。

确定随机元素的索引后,用新变量保存该元素的值,然后交换所选元素和随机元素的值:

var itemAtIndex=输入[random index];输入[random ndex]=输入[I];输入[I]=Itematindex;在这三行代码中,第一行使用新变量保存随机元素的值;在第二行中,所选元素输入[i]的值被分配给随机元素输入[random ndex];];在第三行中,所选元素输入[i]被分配给随机元素值itemAtIndex。本质上是两个元素价值交换的过程,不难理解。

此时,循环中的逻辑被引入,剩下的就是重复操作。

随机性检验

上图是Highcharts制作的随机性测试图,直观地验证了本文洗牌算法的随机性。每次刷新页面时都会重新计算并生成图表。

上图生成的数据计算如下:首先,创建一个数组(上图使用的数组是[0,1,2.18,19,20]),然后使用本文中的洗牌算法重新排序,并在排序完成后记录每个元素的值.此步骤执行100,000次,最后将同一索引位置的值相加。这样做10000次后,索引之间的总值应该相差不大。

可以通过计算得到:

以上内容就是边肖给大家介绍的JS随机洗牌算法的相关叙述。希望对你有帮助!

版权声明:JS随机洗牌算法的数组随机排序是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。