【青训营】月影老师告诉我写好JavaScript的四大技巧——保证正确

编程入门 行业动态 更新时间:2024-10-06 18:25:50

【青训营】月影老师<a href=https://www.elefans.com/category/jswz/34/1771394.html style=告诉我写好JavaScript的四大技巧——保证正确"/>

【青训营】月影老师告诉我写好JavaScript的四大技巧——保证正确

文章目录

  • 起步
  • 洗牌算法
    • 验证正确性
    • 解决方案一:多洗几次
    • 解决方案二: 随机采样
  • 应用
    • 抽奖
    • 分红包
  • 总结
    • 更多相关博文

如何写好JavaScript是每一个前端工程师一直以来在思考的问题,月影老师告诉我们一些写好JavaScript的原则,同时也教了一些我们如何写好JavaScript的技巧,今天来继续跟着月影老师学JavaScript吧~~

起步

我们在编写代码的时候,最重要的是要保证我们的代码的正确性,然而,在有些情况下,代码可以正常运行,看上去也挺对的,但实际上代码可能不是那么正确~

我们来看一个例子

洗牌算法

让你实现一个洗牌算法,你会怎么实现,很快就能想到我们可以直接对数组进行随机排序,就是洗牌了,代码如下

function shuffle(cards) {return [...cards].sort(() => (Math.random() > 0.5 ? -1 : 1));
}const cards = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(shuffle(cards)); // [3, 1, 5, 4, 8, 7, 2, 6, 9, 0]

多运行几次看上去效果不错,确实打乱了顺序

这个算法真的正确吗?或者说这个算法真的公平吗?

验证正确性

我们来验证这个洗牌算法的正确性,如何验证呢?

我们将这个洗牌程序重复一百万次,result数组用来记录每个位置出现过的数字之和,如果这是一个公平的算法的话,result数组中的数字应该都很相近。

const result = Array(10).fill(0);for (let i = 0; i < 1000000; i++) {const c = shuffle(cards);for (let j = 0; j < 10; j++) {result[j] += c[j];}
}console.log(result);

得到的结果是

[3863812, 3862770, 4544657, 4648808, 4669379, 4364000, 4362095, 4722847, 4852688, 5108944]

可以看出这个结果是呈现递增的,而且第一个和最后一个位置的所有数字之和相差还比较大,也就是说,越大的数字出现在数组后面的概率要大一些。每个元素被安排在每个位置的概率是不同的,这是一个不公平的算法。

如何解决这个问题呢?

解决方案一:多洗几次

洗两次

const result = Array

更多推荐

【青训营】月影老师告诉我写好JavaScript的四大技巧——保证正确

本文发布于:2024-02-19 19:40:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765552.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:告诉我   月影   写好   正确   老师

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!