这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。
对于基本的编程,你需要知道下面的:
加减乘除 — 实际上,电脑会帮你作加减乘除运算。你仅需要知道什么时候运用它们。
模运算 — 模运算是用来计算余数,它的符号通常用%百分号来表示。所以23除以7等于3,余数是2。23 mod 7 = 2。
判断是奇数还是偶数的模运算 — 如果你想知道一个数是奇数还是偶数,用它mod 2来作模运算。如果结果是0,它就是偶数。如果结果是1,就是奇数。23 mod 2等于1,所以23是奇数,24 mod 2等于0,24是偶数。
对一个数作百分数运算,就是用这个数来乘以一个百分数。譬如你要得到279的54%,就是用0。54*279。这就意味着为什么1.0等于100%,0.0等于0%。
知道负数是什么。负数乘以负数等于正数。负数乘以正数等于负数。就这么简单。
知道笛卡尔坐标系统。在编程中,(0,0)代表屏幕左上角,Y坐标的正轴往下。
知道勾股定律,因为它是用来计算笛卡尔坐标中两点之间的距离的。勾股定律a^2 + b^2 = c^2。(x1, y1)和(x2, y2)两点之间的距离等于( (x1 – x2)^2 + (y1 – y2)^2 )。
知道十进制、二进制、十六进制。十进制就是我们通常用的十个数:0-9。通常认为这个十进制系统是人类发明的,因为我们有十个手指。
电脑采用二进制数据,只有两个数字:0和1。这是因为我们用电子元件来构建的电脑,让电脑只识别两种状态更便宜些(一种代表0,另一种代表1)。
数是一样的,但是在不同的进制系统里的表现形式不同,因为不同进制包含的数的个数不同。十六进制比十进制多六个数字,所以我们用A-F表示超过9的数。能够表现这些进制系统的最简单方法就是用一个计数器(odometer)。下面三种不同的计数器显示的是同一个数,但在不同的进制系统中的形式不同:
在新窗口中查看计数器页面
你甚至不需要知道怎么从一个进制系统转换成另一个系统。每种编程语言都有帮你转换的函数。
(提示一下,十六进制的使用是因为一个十六进制的数可以表示四个二进制的数。因为十六进制中的3和二进制中的0011对应,十六进制的A和二进制的1010对应,所以十六进制中的3A(十进制的58)可以写成二进制的00111010。十六进制在编程中的使用是因为它是对二进制的简化。没人喜欢写出的数全是0和1。)
就是这么多了。除了进制系统以外,你可以已经知道编程所需的数学知识了。虽然普遍认为编程需要学习许多数学,但实际上并不需要那么多。你可能为了编写一个程序,譬如说地震模拟器,而需要学习数学。其实你更需要学习地震的数学,而不是因为要编写地震模拟器而学习数学。
某些编程领域中更为高级的数学
有一些领域中需要更多的数学知识(但95%的软件中,你都不需要知道它们。)
如果你要写你自己的加密算法(通常不需要你做,因为已经有许多很好的工具了,并且如果你不是加密学的专家的话,你的程序也许会很容易被破解。)如果你仅仅想加密一些数据的话,已经有许多加密和解密的软件库了。
所以就算是以上的情况,你也不需要真正的知道3D图像,物理或者加密的数学。你只需要学习运用软件库就行了。
编程需要学习什么?
你需要学习的是如何建模和设计算法。这意味着,如何将真实世界的运算或者数据处理抽象出来,写出代码,让计算机来帮你运算。例如,在游戏“龙与地下城”(Dungeons and Dragons)中,角色和怪兽都有许多不同的战斗统计值:
要看攻击者打防御者,让攻击者摇动一个20面骰。如果这个数字大于或等于攻击者的THAC0减去防御者的防御能力,那么这个攻击就成功,防御者将受到伤害。不然,防御者就阻击了这个攻击,并且不费血。
我们假设两个人物,Alice和Bob,她们具有以下值:
所以Alice有更多的生命值和防御力(记住,AC越低越好)。但是Bob更可能成功击中对方(记住,THAC0越低越好),并造成更多的伤害。我们说Bob的攻击力更强是因为2d4可以造成2-8点伤害,而Alice的1d6只能造成1-6点伤害。(如果你懂统计学,你可以计算出Bob的期望伤害值是5,比Alice的3。5要高。)
你会打赌Alice或者Bob会赢得比赛对吗?很难讲谁会赢,他们看起来势均力敌。尽管可能你的统计学学得很好,但做这个计算将会十分头疼。编写“龙与地下城”的程序(模拟战斗过程),你甚至不需要知道统计学。仅仅需要运行几百次或者几千次战斗,看看谁赢得更多。
Alice 赢得12909 (43.03%)次战斗. Bob赢得17091 (56.97%)战斗。
所以我们看到使用上面的数值,Bob稍稍占先。电脑进行了30,000次战斗模拟。如果我们用笔和纸还有骰来进行30000次战斗模拟的话,可能需要几个月来算出结果,而我的笔记本仅用了8秒。
那么如果Alice的生命值从14增加到20呢。谁会赢呢?
Alice赢得19438 (64.79%)次战斗. Bob赢得10562 (35.21%)次战斗.
我们看到给Alice增加6点生命值,结果倒过来了,Alice占先了。那么如果Alice的生命值只是增加到16呢?
Alice赢得15176 (50.59%)次战斗啊. Bob赢得14824 (49.41%)次战斗.
所以仅仅增加2个生命值,就已经足够扳回Bob更强攻击力的胜算。
来看这个程序,它只用了加减乘除来计算一个百分比。甚至在更复杂的程序中,需要表示magic spells,治愈部位,多次攻击,在战斗中切换武器等不同效果时,我们也不需要知道更多的数学了。
当然,去学更多的数学吧。可以让你成为更出色的程序员。但是为了学习编程需要多少数学?真的非常少。
更新:我想我应该在基本知识点中增加基本代数,但仅仅需要知道的如 如果X * 3 = 12,知道X等于4。
——————-
虽然大多数开发人员会告诉你,他们在工作中从来不需要数学,但是经过一番沉思后,我有了个想法:就是反马斯洛的锤子理论:当你有一把锤子,你会把一切看成是钉子。
☞ 第一个被认为“科学家”的人:泰勒斯
☞ 数学思维比数学运算更重要
☞ 二十世纪的十大科学骗局
☞ 瞎扯现代数学的基础
☞ x背后的轶闻趣事
☞ 主宰这个世界的10大算法
☞ 16个让你烧脑让你晕的悖论
☞ 机器学习中距离和相似性度量方法
☞ 传说中的快排是怎样的
☞ 玻璃秘史:一个人 改变了全世界
☞ 程序人生的四个象限和两条主线
☞ 比特币的原理及运作机制
☞ 概率论公式,你值得拥有
☞ 分类算法之朴素贝叶斯算法
☞ 采样定理:有限个点构建出整个函数