摘要:许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话,需要学习多少数学呢? 实际上不需要很多 。这篇文章中我会深入探讨编程中所需要的数学知识。
下面是我在reddit的子论坛r/learnprogramming看到的几个帖子:
数学和编程有一种容易让人误解的联系。许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话,需要学习多少数学呢?
实际上不需要很多。这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。
对于基本的编程,你需要知道下面的:
-
加减乘除—实际上,电脑会帮你作加减乘除运算。你仅需要知道什么时候运用它们。
-
模运算—模运算是用来计算余数,它的符号通常用%百分号来表示。所以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+^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会赢得比赛对吗?很难讲谁会赢,他们看起来势均力敌。尽管可能你的统计学学得很好,但做这个计算将会十分头疼。编写“龙与地下城”的程序(模拟战斗过程),你甚至不需要知道统计学。仅仅需要运行几百次或者几千次战斗,看看谁赢得更多。
下面是用Python写的程序:(下载代码)
- importrandom,copy
-
NUM_FIGHTS=1
-
VERBOSE=True
- #Lowerthac0andloweracvaluesarebetter.Higherdamage&hpvaluesarebetter.
-
aliceTemplate={'name':'Alice','hp':14,'ac':5,'thac0':18,'dmgnum':1,'dmgsize':6,'dmgmod':0}
-
bobTemplate={'name':'Bob','hp':12,'ac':7,'thac0':16,'dmgnum':2,'dmgsize':4,'dmgmod':0}
- defdisplay(s):
- ifVERBOSE:
- print(s)
- defattack(attacker,defender):
-
ifrandom.randint(1,20)>=attacker['thac0']-defender['ac']:
-
damage=0
- foriinrange(attacker['dmgnum']):
- damage+=random.randint(1,attacker['dmgsize'])
- damage+=attacker['dmgmod']
- display('%s(%shp)hits%s(%shp)for%spointsofdamage.%sisreducedto%shp.'%(attacker['name'],attacker['hp'],defender['name'],defender['hp'],damage,defender['name'],defender['hp']-damage))
-
defender['hp']-=damage
- else:
- display('%smisses%s.'%(attacker['name'],defender['name']))
-
aliceWins=0
-
bobWins=0
- foriinrange(NUM_FIGHTS):
- display('======================')
- display('Startofcombat#%s'%(i+1))
-
alice=copy.deepcopy(aliceTemplate)
-
bob=copy.deepcopy(bobTemplate)
- whileTrue:
- attack(alice,bob)
-
ifbob['hp']<=0:
- break
- attack(bob,alice)
-
ifalice['hp']<=0:
- break
-
ifalice['hp']<=0:
- display('Alicehasdied.')
- bobWins+=1
-
ifbob['hp']<=0:
- display('Bobhasdied.')
- aliceWins+=1
- print()
- print('Alicewon%s(%s%%)fights.Bobwon%s(%s%%)fights.'%(aliceWins,round(aliceWins/NUM_FIGHTS*100,2),bobWins,round(bobWins/NUM_FIGHTS*100,2)))
当运行这个程序时,你会看到:
- Startofcombat#1
- AlicemissesBob.
- Bob(12hp)hitsAlice(14hp)for6pointsofdamage.Aliceisreducedto8hp.
- AlicemissesBob.
- BobmissesAlice.
- AlicemissesBob.
- BobmissesAlice.
- AlicemissesBob.
- BobmissesAlice.
- Alice(8hp)hitsBob(12hp)for5pointsofdamage.Bobisreducedto7hp.
- BobmissesAlice.
- AlicemissesBob.
- BobmissesAlice.
- AlicemissesBob.
- Bob(7hp)hitsAlice(8hp)for2pointsofdamage.Aliceisreducedto6hp.
- Alice(6hp)hitsBob(7hp)for6pointsofdamage.Bobisreducedto1hp.
- BobmissesAlice.
- Alice(6hp)hitsBob(1hp)for1pointsofdamage.Bobisreducedto0hp.
- Bobhasdied.
- Alicewon1(100.0%)fights.Bobwon0(0.0%)fights.
但是可能Alice正好在某一次战斗中很幸运。让我们关掉输出再重新运行程序(在屏幕输出比运行程序更耗时间),当战斗次数达到30,000次时(将NUM_FIGHTS改成30000,VERBOSE变量变成False):
- 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。
译文来自:伯乐在线
原文链接:The “Invent with Python” Blog
分享到:
相关推荐
学编程要掌握的数学知识学编程要掌握的数学知识学编程要掌握的数学知识学编程要掌握的数学知识
一些数学知识, 简单却不简单。有助于编程的提高。绝对有助于编程提高。。。。。。。。。
数控编程中的数学处理方法.pptx
本资源是一套关于少儿编程的深度融合课程,采用Scratch可视化编程工具,结合数学知识,旨在帮助孩子们在编程学习过程中深入理解数学概念,培养逻辑思维和创造力。。 适用人群: 想要学习编程和数学的少儿和家长。...
2 编程需要E文和数学知识很优秀吗? 3 学了很长时间只会做题目,怎么在实际中用? 4 现在QBASIC能不能适应现在的编程要求吗?它对以后学习高级语言有没有什么大的用处吗?现在学习它是不是浪费时间呢?
CSP-J、CSP-S初赛知识点-信息学竞赛中的数学知识_2019_10_15
游戏编程数学和物理基础,主要讲解设计游戏时使用的数学和物理知识。
计算机数学基础.编程高等数学:微分积分;学习电子基础必备知识,分享给大家.
Haskell road to logic,maths and programming是一本很实用的应用类书籍,其中详细讲解了离散数学中相关知识理论在编程中的具体映射关系,很透彻地表征了编程中的离散数学思想。
【数学知识】高一的集合知识的Python编程实现Python3 集合概念集合与元素的关系集合与集合的关系集合与集合的运算 本博客适合高中学生入门编程知识学习,从高中的数学概念转换到其python实现,提高自身对编程的学习...
python青少年趣味编程旨 在让中小学生了解编程,学习编程,运用编程,综合数学、英语等多学科,引导青少年学生 学习pyth。n编程知识点,加深对编程的理解,培养并锻炼逻辑思维、提高分析问题、解决 问题的能力。感受...
Python 编程: 书中可能包含与 Python 编程语言相关的基础知识,使读者能够使用 Python 进行数学建模和解决问题。 数学概念: 通过项目和实际的编程练习,介绍数学概念,例如几何、代数、概率等。这样的方法有助于...
本书讨论了三角几何知识、向量和矩阵运算、变换、碰撞和能量,以及1D/2D/3D空间内的运动等内容,循循善诱地指导读者如何利用数学和物理知识达到提升自身游戏开发水平的目的。 本书分上下两册,此为下册,特此说明.....
本书讨论了三角几何知识、向量和矩阵运算、变换、碰撞和能量,以及1D/2D/3D空间内的运动等内容,循循善诱地指导读者如何利用数学和物理知识达到提升自身游戏开发水平的目的。 本书分上下两册,此为上册,特此说明.....
python青少年趣味编程旨在让中小学生了解编程,学习编程,运用编程,综合数学、英语等多学科,引导青少年学生学习python编程知识点,加深对编程的理解,培养并锻炼逻辑思维、提高分析问题、解决问题的能力。...
本书共分四个部分,第一部分是数学建模中所用到的数学知识的系统介绍以及它们在Matlab中的实现方法;第二部分是数学模型的实例的分析,精选了大量的经典例题和真题,详细地给出了每个例题的建模过程以及在Matlab中的...
第4~5章简要地介绍了一些数学知识并实现了一个数学库,供以后编写演示程序时使用;第6章概述了3D图形学,让读者对《3D 游戏编程大师技巧(附光盘)》将介绍的内容有大致的了解;第7~11章分别介绍了光照、明暗处理、...
组合数学,一种跟计算机编程相关的数学知识,我们学过的排列组合就包括其中
基础图论知识,编程必学,搞ACM的或者IOI的可以看一下