跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

加餐1 | 作为一名程序员,数学到底要多好?

小试牛刀
小结
个人经历
数学对程序员的重要性

该思维导图由 AI 生成,仅供参考

你好,我是月影。
刚刚学完了可视化的数学篇,今天咱们放松一下,以我的个人经历来聊一聊,数学对我们程序员的重要性。
作为奇舞团团长和从事前端 15 年以上的“老人”,我为团队面试过许多同学,也和许多同学聊过前端或者程序员的职业发展方向。一般来说,我面试的时候会要求面试者有一定的数学基础,在聊关于职业发展的话题时,我也会强调数学对于程序员成长的重要性。甚至,在可视化这门课里面,我也认为学习可视化的第一步是学好图形学相关的数学知识。
不过,行业里也有些不同的声音,有些人觉得除了部分特殊的领域,大部分普通的编程领域不太需要数学知识。比如说,在我们平时的 Web 开发项目中,不论是前端还是后端,似乎更多地是和产品与业务逻辑打交道,比较少或几乎没有用到数学知识。甚至有些人认为,程序员根本用不着学好数学,特别是在前端这样偏 UI 层的领域,数学更是没有用武之地。
当然,以上这些认为数学不重要的想法,我都可以理解,曾经我自己也没有意识到数学和编程有什么必然的联系。而且,我当年在学校学习的时候,数学也学得很马虎,基础也不是那么好。不过后来,我个人的一段经历,让我很早就意识到数学对编程的重要性,而这个认知,对我后来的职业发展有着非常重要的影响。所以,我想在这里和你分享一些我个人成长中的经历和收获,希望能对你有些帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

程序员的数学能力备受争议,但本文作者通过自身经历强调了数学在编程中的重要性。作者分享了实习经历和两个数学问题的解答,突出了数学在编程中的实际应用。文章强调选择正确的数学工具能将复杂问题转化为简单问题,从而顺利解决。作者还分享了两个案例,展示了数学思维在工作中的应用。总结指出,程序员不需要高深的数学知识,但数感和数学思维锻炼对逻辑能力和技术能力提升至关重要。文章以两道思考题结束,鼓励读者锻炼数学思维能力。整体而言,本文强调了数学在编程中的重要性,以及正确选择数学工具的重要性,为程序员提供了深刻的启示和思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • coolseaman
    五个硬币一共2的5次方中情况,全是反面1种情况,一个反面C(5, 1) = 5种情况,两个反面C(5, 2) = 10种情况,所以1-(1 + 5 + 10) / 32 = 1 / 2

    作者回复: 👍

    2020-07-14
    8
  • Geek_dudu
    如果左右两边都可以放砝码,那是三种状态,0,左,右。按上述思路,就是5个砝码:1,3,9,27,81

    作者回复: 对,这样就是三进制

    2020-07-14
    7
  • Mingzhang
    五个硬币共有 5 0 4 1 3 2 2 3 1 4 0 5 这六种分布情况。每种情况的具体概率需要计算,但是可知 5 0 和 0 5 的概率相同,4 1 和 1 4 概率相同,3 2 和 2 3 概率相同。三个或三个以上正面,即 5 0,4 1 和 3 2 三种情况,可知为 50% 的概率。

    作者回复: 对,这是个好办法

    2020-07-26
    6
  • 靠人品去赢
    (1)第一个题目可以根据向量来判断 ,ab,cd假设都是从(0,0)开始,ab(x1,y1),cd(x2,y2)做向量相乘得0就是平行,否则不管是逆时针还是顺时针都是相交。 (2)满足情况分三类,5个里面有3个,5个里面有4个,5个全是,本别是C53,C54,C55也就是10,5,1.实际一共是2的5次方也就是32,16/32=0.5

    作者回复: 对

    2020-07-17
    6
  • Geek_dudu
    第一题的思路如下,如有错误,还望指出(代码里的一些方法是用的月影老师的vector2d库) 分别算出角cab,dab的sin值,判断c,d两个点是不是ab的一侧,还是两侧 然后再算出acd,bcd的sin值,排除c,d两点虽然在ab的两侧,但是cd和ab线段由于长度问题没相交(那样的话a,b两点肯定是在cd的一侧的) 额外情况:ab或cd有一个点再对应线段上 function isIntersect(A, B, C, D) { const AB = B.copy().sub(A); const AC = C.copy().sub(A); const AD = D.copy().sub(A); const CD = D.copy().sub(C); const CA = A.copy().sub(C); const CB = B.copy().sub(C); const sinCAB = AB.cross(AC); const sinDAB = AB.cross(AD); const sinACD = CA.cross(CD); const sinBCD = CB.cross(CD); const ACP = Math.round(AC.dot(AB) / AB.len ** 2); const ADP = Math.round(AD.dot(AB) / AB.len ** 2); const CAP = Math.round(CA.dot(CD) / CD.len ** 2); const CBP = Math.round(CB.dot(CD) / CD.len ** 2); if (sinCAB === 0 && ACP >= 0 && ACP <= 1) { return true; } else if (sinDAB === 0 && ADP >= 0 && ADP <= 1) { return true; } else if (sinACD === 0 && CAP >= 0 && CAP <= 1) { return true; } else if (sinBCD === 0 && CBP >= 0 && CBP <= 1) { return true; } else if (Math.sign(sinCAB) === - Math.sign(sinDAB) && Math.sign(sinACD) === -Math.sign(sinBCD)) { return true; } return false; }

    作者回复: 挺好的,其实可以只判断在两侧就好,两条线段再交换判断一次就可以排出线段太短的问题

    2020-07-15
    2
  • Geek_dudu
    随机抛一次,有 3 个或 3 个以上硬币正面朝上的概率是多少? 答案:50% 思路:还是二进制的思路,假如正面为1,反面为0,就是求0-31,二进制中1的个数大于等于3的数的个数。求二进制中1的个数,是个很经典的面试题了,然后再统计下大于等于3的个数就好了。

    作者回复: 嗯嗯,可以的

    2020-07-14
    1
  • Geek_0a5ac5
    5 个硬币,随机抛一次,有 3 个或 3 个以上硬币正面朝上的概率 是 1/2

    作者回复: 答案是对的,你的思路是啥?

    2020-07-13
    2
    1
  • 诺亚
    第一个三个数相减的,按程序员的思维,不是应该是 0 0 0 吗?😄

    作者回复: 哈哈,000是一个解

    2020-12-24
    2
  • 龙眼
    function compareTwoVector(sin1: number, sin2: number): boolean { if (sin1 === 0) { if (sin2 < 0 || sin2 > 0) { return true } } else if (sin1 > 0) { if (sin2 < 0) { return true } } else if (sin1 < 0) { if (sin2 > 0) { return true } } return false } function isInsert(A: Vector2D, B: Vector2D, C: Vector2D, D: Vector2D): boolean { const AB = B.copy().sub(A) const AC = C.copy().sub(A) const AD = D.copy().sub(A) const CD = D.copy().sub(C) const CA = A.copy().sub(C) const CB = B.copy().sub(C) const sinCAB: number = AB.cross(AC) const sinDAB: number = AB.cross(AD) const sinACD: number = CA.cross(CD) const sinBCD: number = CB.cross(CD) return compareTwoVector(sinCAB, sinDAB) || compareTwoVector(sinDAB, sinCAB) || compareTwoVector(sinACD, sinBCD) || compareTwoVector(sinBCD, sinACD) } 我大学是学的动画专业,算是艺术生,数学渣的很,老师你讲的很好,但因为我数学太渣了所以我自己通过理解Geek_dudu写的函数,再加上自己百度了https://www.cnblogs.com/tuyang1129/p/9390376.html中对判断两条线段是否相交的讲解,我写出如上的函数,我自己测试了平行,相交,一个端点在另一条直线上的相交都通过了,请老师帮我看看这样写是否正确。

    作者回复: 这个没有问题,很赞

    2020-09-21
  • Geek_3469f6
    function intersection(pa, pb, pc, pd) { const a = pb[0] - pa[0]; const b = pb[1] - pa[1]; const c = pd[0] - pc[0]; const d = pd[1] - pc[1]; const v1 = [a, b]; const v2 = [c, d]; // 向量平行的情况下 // 1. 线段平行 // 2. 线段由重合部分 if (horizon(v1, v2)) { if (inLine(pa, pb, pc)) { return [true, pc]; } if (inLine(pa, pb, pd)) { return [true, pd]; } if (inLine(pc, pd, pa)) { return [true, pa]; } if (inLine(pc, pd, pb)) { return [true, pb]; } } const deltay = pa[1] - pc[1]; const deltax = pa[0] - pc[0]; const m = (c * deltay - d * deltax) / (a * d - b * c); const v = extend(m, v1); const pnt = [v[0] + pa[0], v[1] + pa[1]]; const m1 = (pnt[0] - pc[0]) / c; return [m >= 0 && m <= 1 && m1 >= 0 && m1 <= 1, pnt]; } // 判断两个向量是否平行 function horizon(v1, v2) { let diff = v1[0] * v2[1] - v1[1] * v2[0]; return Math.abs(diff) <= 1.0e-5; } // 点pnt是否在由[start, end]组成的线段上 function inLine(start, end, pnt) { const v1 = vector(start, pnt); const v2 = vector(end, pnt); if (horizon(v1, v2) && dot(v1, v2) < 0) { return true; } } 想法是计算两个向量是否平行,不平行的情况下计算交点在线段上还是延长线上。

    作者回复: 对的

    2020-07-15
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部