想要学好编程,数学是基础,你知道需要哪些数学知识吗?
前⾔
数学和编程有⼀种容易让⼈误解的联系。许多⼈认为在开始学习编程之前必须对数学很在⾏或者数学分数很⾼。但⼀个⼈为了编程的话,需要学习多少数学呢?
实际上不需要很多。这篇⽂章中我会深⼊探讨编程中所需要的数学知识。你可能已经都知道了。
对于基本的编程,你需要知道下⾯的:
加减乘除 — 实际上,电脑会帮你作加减乘除运算。你仅需要知道什么时候运⽤它们。
模运算 — 模运算是⽤来计算余数,它的符号通常⽤%百分号来表⽰。所以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游戏和3D绘图 — 3D通常需要涉及三⾓函数和线性代数(⽤矩阵来解决问题的数学)。当然,有许多3D图形库已经实现了这些数学编程,你不需要知道这些数学。
2D物理(譬如愤怒的⼩鸟)和3D物理(譬如许多流⾏的3D游戏) — 为了写涉及到物理的编程,你需要学习⼀些物理⽅程和公式(尤其是⼒学,如弹⼒,重⼒,球滚下斜坡等物理。)然⽽,已经有⼀些物理引擎和软件库帮你实现了,所以你也不需要知道游戏(如愤怒的⼩鸟)中的物理公式。
加密学 — 事实上我指的是RSA。你需要知道质数的有关知识,以及如何求最⼤公约数(其实是个⾮常简单的算法,还有许多编程语⾔中都有gcd()函数,帮你求解最⼤公约数)其他的编码⼤部分就是将数据按照某种步骤挪动。举个例⼦,下⾯的flash就是AES“Rijndael”编码的步骤。所有的步骤包含⽤⼀些数减去另⼀些数,将⾏向上移,将列数字打乱,再作简单的加法运算。
如果你要写你⾃⼰的加密算法(通常不需要你做,因为已经有许多很好的⼯具了,并且如果你不是加密学的专家的话,你的程序也许会很容易被破解。)如果你仅仅想加密⼀些数据的话,已经有许多加密和解密的软件库了。
所以就算是以上的情况,你也不需要真正的知道3D图像,物理或者加密的数学。你只需要学习运⽤软件库就⾏了。
编程需要学习什么?
你需要学习的是如何建模和设计算法。这意味着,如何将真实世界的运算或者数据处理抽象出来,写出代码,让计算机来帮你运算。例如,在游戏“龙与地下城”(Dungeons and Dragons)中,⾓⾊和怪兽都有许多不同的战⽃统计值:
⽣命值(Hit points)是⼀个⼈死前所能经受的伤害值。越⾼的⽣命值就意味着可以经受更多的伤害。
防御等级(armor class)是对你的武器防御能⼒的量度。防御值越低,武器的防御能⼒越⾼。
THAC0(读作“thay-co”,“To Hit Armor Class 0”),是对⼀个⼈进⾏有效攻击的能⼒的测量。THAC0值越低,攻击越准。
武器的攻击⼒⽤类似1d6+2来表⽰,它表⽰摇⼀个六⾯骰得到的值,然后再加2。2d4就是摇2个4⾯骰,然后将它们相加。(“龙与地下城”采⽤的是4,6,8,10,12和20⾯骰。)
要看攻击者打防御者,让攻击者摇动⼀个20⾯骰。如果这个数字⼤于或等于攻击者的THAC0减去防御者的防御能⼒,那么这个攻击就成功,防御者将受到伤害。不然,防御者就阻击了这个攻击,并且不费⾎。
我们假设两个⼈物,Alice和Bob,她们具有以下值:
Alice: HP 14, AC 5, THAC0 18, DAMAGE 1d6
Bob: HP 12, AC 7, THAC0 16, DAMAGE 2d4
所以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。
——————-
虽然⼤多数开发⼈员会告诉你,他们在⼯作中从来不需要数学,但是经过⼀番沉思后,我有了个想法:就是反马斯洛的锤⼦理论:当你有⼀把锤⼦,你会把⼀切看成是钉⼦。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。