「前端进阶」数组乱序

引言

数组乱序指的是:将数组元素的排列顺序随机打乱。

将一个数组进行乱序处理,是一个非常简单但是非常常用的需求。 比如,“猜你喜欢”、“点击换一批”、“中奖方案”等等,都可能应用到这样的处理。

sort 结合 Math.random

微软曾在browserchoice.eu上做过一个关于不同浏览器使用情况的调查,微软会在页面中以随机顺序向用户显示不同的浏览器。

在这里插入图片描述
然而每个浏览器出现的位置并不是随机的。IE在最后一个位置出现的概率大概是50%,Chrome在大部分情况下都会出现在浏览器列表的前三位。

这是怎么回事,不是说好的随机顺序么?

这是他们用来做随机shuffle的代码:

arr.sort(() =>Math.random() - 0.5);
复制代码

乍一看,这似乎是一个合理的解决方案。事实上在使用搜索引擎搜索“随机打乱数组”,这种方式会是出现最多的答案。

然而,这种方式并不是真正意思上的乱序,一些元素并没有机会相互比较, 最终数组元素停留位置的概率并不是完全随机的。

来看一个例子:

/**
* 数组乱序
*/
function shuffle(arr) {
 return arr.sort(() => Math.random() - 0.5);
}
复制代码
/**
* 用于验证 shuffle 方法是否完全随机
*/
function test_shuffle(shuffleFn) {
 // 多次乱序数组的次数
 let n = 100000; 
 // 保存每个元素在每个位置上出现的次数
 let countObj = {
 a:Array.from({length:10}).fill(0),
 b:Array.from({length:10}).fill(0),
 c:Array.from({length:10}).fill(0),
 d:Array.from({length:10}).fill(0),
 e:Array.from({length:10}).fill(0),
 f:Array.from({length:10}).fill(0),
 g:Array.from({length:10}).fill(0),
 h:Array.from({length:10}).fill(0),
 i:Array.from({length:10}).fill(0),
 j:Array.from({length:10}).fill(0),
 }
 for (let i = 0; i < n; i ++) {
 let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
 shuffleFn(arr);
 countObj.a[arr.indexOf('a')]++;
 countObj.b[arr.indexOf('b')]++;
 countObj.c[arr.in
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值