告诉我写好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的四大技巧——保证正确
发布评论