不二如是 发表于 2017-10-6 09:31:16

编程与数学的“奇妙”关系 | 【方法论&实操】

本帖最后由 不二如是 于 2017-10-6 11:15 编辑




上面这张图很经典,介绍的是“程序员”的进阶之路,不做翻译了,自行领悟!

接下来我想主要探讨编程中所需要的数学知识。

有言在先:
如果你都知道了,那么欢迎补充,一起完善这篇文章。

如果你不知道,也欢迎提出你的宝贵意见,为后人留下一些线索。

对于基础编程,你只需要了解一下的数学知识:
        ◊加减乘除 — 实际上,电脑会帮你作加减乘除运算。
你仅需要知道什么时候运用它们,如果你完成了祖国的小学基础教育,请自动忽略这条。
       
        ◊模运算 — 模运算是用来计算余数,它的符号通常用%百分号来表示。
所以13除以8等于1,余数是5。13 mod 8 = 5。

        ◊判断奇偶数的模运算 。
如果你想知道一个数是奇数还是偶数,用它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)

具体细节,不做介绍了,有兴趣的自行看:EDVAC #ENIAC 双胞胎兄弟 #第一台采用冯·诺依曼体系结构的二进制计算机



数是一样的,但是在不同的进制系统里的表现形式不同,因为不同进制包含的数的个数不同。

十六进制比十进制多六个数字,所以我们用A-F表示超过9的数。

能够表现这些进制系统的最简单方法就是用一个计数器(odometer)。

下面图中显示同一个十进制数字在不同进制下的表示:


你甚至不需要知道怎么从一个进制系统转换成另一个系统。每种编程语言都有帮你转换的函数。

友情提醒:
        十六进制的使用是因为一个十六进制的数可以表示四个二进制的数。因为十六进制中的3和二进制中的0011对应,十六进制的A和二进制的1010对应,所以十六进制中的3A(十进制的58)可以写成二进制的00111010。十六进制在编程中的使用是因为它是对二进制的简化。没人喜欢写出的数全是0和1。

虽然普遍认为编程需要学习许多数学,但实际上并不需要那么多。

你可能为了编写一个程序,譬如说地震模拟器,而需要学习数学。

在日常项目中:
        为了实现某种需求而去学习,是更有目的性且更为行之有效的做法!


http://xxx.fishc.com/forum/201703/17/085856sx6zu2339fucuwx4.png

推荐阅读:游戏开发入门指南 | 【图文版】

有一些领域中需要更多的数学知识,例如:游戏、加密学
(但95%的软件中,你都不需要知道它们。)

3D游戏和3D绘图 — 3D通常需要涉及三角函数和线性代数(用矩阵来解决问题的数学)。

当然,有许多3D图形库已经实现了这些数学编程,你不需要知道这些数学。

2D物理(譬如愤怒的小鸟)和3D物理(譬如许多流行的3D游戏)。

为了写涉及到物理的编程,你需要学习一些物理方程和公式
(尤其是力学,如弹力,重力,球滚下斜坡等物理。)

然而,已经有一些物理引擎和软件库帮你实现了,所以你也不需要知道游戏(如愤怒的小鸟)中的物理公式。



加密学事实上我指的是RSA。

你需要知道质数的有关知识,以及如何求最大公约数,其他的编码大部分就是将数据按照某种步骤挪动。
(其实是个非常简单的算法,还有许多编程语言中都有gcd()函数,帮你求解最大公约数)

如果你要写你自己的加密算法(通常不需要你做,因为已经有许多很好的工具了)

如果你仅仅想加密一些数据的话,已经有许多加密和解密的软件库了。

所以就算是以上的情况,你也不需要真正的知道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会赢得比赛对吗?

答案:
**** Hidden Message *****

尽管可能你的统计学学得很好,但做这个计算将会十分头疼。

编写“龙与地下城”的程序(模拟战斗过程),你甚至不需要知道统计学。

仅仅需要运行几百次或者几千次战斗,看看谁赢得更多。

模拟结果:
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,治愈部位,多次攻击。

在战斗中切换武器等不同效果时,我们也不需要知道更多的数学了。

当然,去学更多的数学吧。

可以让你成为更出色的程序员。

但是为了学习编程需要多少数学?

真的非常少!

真的非常少!

真的非常少!

xuanmuluck 发表于 2017-10-6 16:11:01

我觉得是无形中数学里的逻辑和思路在影响着编程,当然计算机设计的一开始就是要解决计算的问题

2素儿 发表于 2017-10-6 16:41:09

{:10_256:}

tttb 发表于 2017-10-6 21:42:09

大佬你把傅里叶函数放哪里了   我的笛卡尔呢哈哈

平凡. 发表于 2017-10-7 07:09:55

我想看

cuml 发表于 2017-10-7 21:47:13

这个很重要谢谢

YINXINGSHU 发表于 2017-10-28 14:25:19

数学很重要
页: [1]
查看完整版本: 编程与数学的“奇妙”关系 | 【方法论&实操】