var array = [3,9,23,76,1,54,21,12,0,9,2];
var shuffled = array.sort(function() {return 0.5 - Math.random()});
console.log(shuffled);
我知道结果,也很满意。
上面的代码返回我的数组元素的打乱顺序。
我对它为什么会导致该输出感到困惑。
里面的函数有什么意义,.sort
它对输出有何贡献?
var array = [3,9,23,76,1,54,21,12,0,9,2];
var shuffled = array.sort(function() {return 0.5 - Math.random()});
console.log(shuffled);
我知道结果,也很满意。
上面的代码返回我的数组元素的打乱顺序。
我对它为什么会导致该输出感到困惑。
里面的函数有什么意义,.sort
它对输出有何贡献?
该函数实际上有两个参数,它们是数组中的 2 个项目。目的是比较这些元素并返回一个数字。
如果数字是正数,则第二项应在第一项之前。
如果数字为 0 或负数,则第二项应在第一项之后。
[0,1].sort(function(a,b){return 1;}); // [1, 0], reverses order
[0,1].sort(function(a,b){return 0;}); // [0, 1], does nothing
[0,1].sort(function(a,b){return -1;}); // [0, 1], does nothing
在上述示例的每种情况下,a === 0
并且b === 1
.
要逐步查看升序排序时发生的情况[1,3,2,4,4,0]
,可以编写一个函数来准确记录每一步发生的情况
arr = [1,3,2,4,4,0];
arr.sort(function(a,b){ // ascending order sort
var result = a-b,
str = '';
if(result > 0) str = 'so swapping';
else if(result === 0) str = 'so ignoring'
else str = 'so continuing';
console.log('with [ '+arr.join(', ')+' ]','comparing',a,'to',b,'resulting in',result, str);
return result;
});
console.log('resulting in [ '+arr.join(', ')+' ]');
哪个输出
with [ 1, 3, 2, 4, 4, 0 ] comparing 1 to 3 resulting in -2 so continuing
with [ 1, 3, 2, 4, 4, 0 ] comparing 3 to 2 resulting in 1 so swapping
with [ 1, 3, 3, 4, 4, 0 ] comparing 1 to 2 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 3 to 4 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 4 resulting in 0 so ignoring
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 3 to 0 resulting in 3 so swapping
with [ 1, 2, 3, 3, 4, 4 ] comparing 2 to 0 resulting in 2 so swapping
with [ 1, 2, 2, 3, 4, 4 ] comparing 1 to 0 resulting in 1 so swapping
resulting in [ 0, 1, 2, 3, 4, 4 ]
为了完整性,原始问题中随机算法的概率表(估计,基于每个索引的 500,000 次试验),X 是起始索引
x 0 1 2 3 4 5 6 7 8 9 10
0 | 8.0, 8.0, 6.2, 6.6, 9.2, 10.8, 9.3, 6.6, 6.2, 9.7, 18.8
1 | 4.5, 4.6, 7.8, 12.2, 16.9, 12.9, 11.4, 10.7, 8.7, 6.1, 3.6
2 | 15.5, 15.5, 10.3, 5.9, 3.7, 3.8, 5.7, 8.3, 10.6, 11.7, 8.5
3 | 10.4, 10.3, 13.4, 10.2, 7.0, 6.5, 7.8, 9.4, 9.7, 8.8, 6.0
4 | 6.4, 6.3, 10.7, 15.4, 11.4, 9.5, 9.6, 9.9, 8.9, 6.9, 4.4
5 | 16.1, 16.1, 10.9, 7.7, 7.4, 7.6, 6.2, 4.4, 4.1, 6.5, 12.5
6 | 4.7, 4.7, 7.1, 9.7, 12.6, 16.3, 13.6, 11.9, 9.2, 6.1, 3.6
7 | 6.0, 6.0, 7.7, 8.9, 9.4, 10.9, 14.0, 13.6, 11.2, 7.4, 4.3
8 | 8.4, 8.3, 9.1, 8.6, 7.3, 6.7, 8.2, 11.6, 13.8, 10.8, 6.7
9 | 11.5, 11.4, 10.1, 7.6, 5.0, 3.7, 4.2, 6.7, 10.9, 15.8, 12.6
10 | 8.0, 8.1, 6.2, 6.6, 9.2, 10.9, 9.2, 6.6, 6.1, 9.8, 18.8
to 的参数sort
是一个排序回调,它是一个函数,它应该将两个值作为参数排序并返回负数、0 或正数,具体取决于比较的第一个值是小于、等于还是大于第二个。
在您的特定示例中,此回调完全忽略比较的实际值,而是生成一个随机数Math.random
,它返回范围 0 .. 1 中的值并将其从 0.5 中减去以将结果范围更改为 -0.5 .. 0.5。这使得排序随机假设一个值小于或大于另一个值,并最终生成随机打乱的列表,而不是按某些“真实”条件排序。
我认为排序的目的是随机排列列表中的项目。sort() 方法的匿名函数要么返回正值,要么返回负值,这正是回调应该做的事情。
排序回调应该用于比较两个项目,并分别返回 -1、0 或 -1 以表示小于、相等和大于。
现在可能还有另一个关于这是否是随机化的好方法的讨论,因为比较函数可能会在离散调用中为相同的两个对象返回不同的值.....