需要数学基础的编程有哪些?

27

这不是一个“编程需要数学吗?”的问题。

我一直认为编程需要大量复杂的数学(我在大学只学了中级代数,因为我数学不好)。

然而,我刚刚得到了我的第一份开发人员工作,并发现除了基本算术外,并没有太多高深的数学内容(至少目前为止)。我还在 Stack Overflow 上看到有一个问题说,数学更多地用于确保想要成为开发人员的人能够理解复杂的问题并解决它们。

所以我猜有没有一种需要超过代数水平的数学的其他类型的编程? 我猜想像几何学和其他与视频游戏编程有关的学科,其中你需要在三维空间中创建形状并操纵时间和空间。 还有什么需要高水平的数学知识?

编辑:哇,很多答案。其中一个让我想到了另一个类似的问题......比如在像 Photoshop 这样的程序中,制作旋转、裁剪、编辑和着色图像涉及了哪些数学(或总体工作)?


学习高阶数学(即超过代数)可以教会学生如何逻辑思考,并在某种程度上教会他们如何有条理地解决问题。货运编码人员通常是数学能力较低的人。 "货运编码人员"是指编程实践类似于“货物神话”成员的做法(基本上,改变垃圾直到它不再爆炸)。 "Asploding" 是一个幽默的流行文化参考。 - DwB
11
不要用“低”数学技能的标准来衡量所有人的能力。编写优秀的软件需要具备逻辑思维和组织能力,但创造力和精湛的技巧同样重要。我认识一些没有数学背景但编写出优秀软件的人,也认识一些出色的数学家,但他们编写的软件让我感到恶心。就像其他任何事情一样,拥有这四种能力的完美结合是一种天赋,就像能够演奏音乐或绘画一样:你要么拥有它,要么没有。 - Blrfl
一个人可以在许多编程专业领域成为出色的程序员,但在高级数学方面可能很差;同样,一个杰出的数学家也可能是个糟糕的程序员。我不同意dwb的观点,认为仅仅学习数学并不能教会人们如何逻辑思考。数学课程中的糟糕结果难道不常常归因于糟糕的老师们布置了大量与现实无关的繁琐作业,导致学生完全没有动力去进一步探索吗? - CPrimer
17个回答

39

我认为至少有两种回答这个问题。首先,有一些编程类型的问题来自于需要数学知识的领域。这些包括:

  • 金融
  • 科学研究,例如物理建模
  • 工程实施,例如应力分析、化学工程
  • 实验科学,例如物理学、心理学
  • 数学本身
  • 密码学
  • 图像处理
  • 信号处理

其次,还有一些编程类型的问题,目标不一定是数学相关的,但是实现该目标的过程需要一些数学技能。这些包括:

  • 游戏
  • 优化过程
  • 高复杂性系统,例如飞行控制软件
  • 高可用性系统,例如工业流程监控和/或安全
  • 复杂数据转换,例如编译器设计

等等。其中各种问题需要不同层次和方面的数学知识。


1
你应该把密码学放在第一批。相比之下,它比金融更加合适。 - Alin Purcaru
7
值得一提的是,如果你被雇用作为第一组项目的开发人员,数学问题通常会由该领域的专家处理,而不是交给程序员处理。 根据我的经验,程序员可能只需要将Matlab代码或伪代码翻译成源代码。 - Graphics Noob

9
游戏和模拟是显而易见的答案。数学并不难,但显然存在着。例如,假设你想要构建某种小行星游戏。您需要确定您的太空船的位置。这是一个向量。现在您希望每帧以某个方向前进一定的方向。您需要将某种delta-x添加到x,并将delta-y添加到y,以使您的运动成为另一个向量:。在小行星游戏中,您会加速指向的方向,因此每当您按下“推力”键时,您都需要计算dx和dy的增量或加速度向量。
(是的,这与微积分课程中的dx相同,但现在我正在用它来构建机器人僵尸负鼠。)
但这还不是全部。如果您现在行动,我将加入一些三角函数。通常,您认为运动和加速度是角度和距离(r和theta),但编程语言通常需要这些值以dx,dy格式呈现。这就是您将使用一些三角函数的地方:dx = r * cos(theta)和dy = r * sin(theta)
但是,假设您想要有一个具有引力的行星?您需要以一种近似引力的方式来获得轨道行为(椭圆形轨道,发射更改轨道的另一侧的高度等)。如果您理解牛顿普遍引力定律,这样做最容易:f =((sqrt(m1 * m2))/ d ^ 2)* G。这告诉您每帧需要添加多少“向行星”的力量到您的飞船中。将该值乘以从太空船指向行星的归一化向量,并将其作为新的运动向量添加。
信不信由你,我鼓励不喜欢数学的人参加游戏编程课程。通常,他们会发现,在处理涉及太空中爆炸的奶牛之类的问题时,数学可能是(我敢说)有点有趣的。
再举一个例子,考虑优化声波。模拟波形具有无限数量的点。在数字信号中无法存储它们所有,因此我们将音频信号分成许多小段,然后测量每个段。如果我们想要完美的表示,那么就需要获取无限数量的无限小时间片。
将其绘制出来,您就创建了黎曼和,积分(事实上是微积分)的基本思想。
还有一个例子:我的一个朋友(生物学教授)试图构建一个湖泊生态系统的“模拟城市”风格模拟。他是一个不错的程序员,但却陷入了各种计算中。他希望用户可以改变对湖泊的使用(外置电机,钓鱼限制和倾倒限制),然后查看它如何影响氮和其他关键元素的水平。他尝试了各种疯狂的if-then结构,嵌套条件和丑陋的布尔逻辑,但从未有过干净的解决方案。
我们采用实际数据并使用Excel进行运算,找到了一条趋势线,通过简单的对数公式准确地反映了他的数据。数百行混乱的代码被简化成一个简单的公式。

7
以下是一些常见的领域:
  • 图形处理
  • 密码学
  • 统计学
  • 压缩
  • 优化
还有很多特定问题领域需要用到复杂数学,但这更多地是因为程序本身的性质而非编程本身。例如金融应用程序。

6
任何类型的数值分析,例如在地球物理学或石油勘探中。
我曾经为事故调查员建立了一个需要大量三角函数的工具。
在商业编程中,不太需要数学,而是需要算术。

6
所有编程都需要数学。我认为具备数学背景和编程背景的人之间的区别在于,他们解决问题的方式和答案不同。但是,如果您正在提高编程技能,您很可能无意中也在提高数学技能(反之亦然)。
如果您抽象地看编程和数学,您会发现它们在方法上是相同的:它们都努力使用非常基础的构建块来解决问题。
Edsger W. Dijkstra写了一篇相当著名的文章,试图回答您的确切问题。它被称为: 论数学和编程之间的相互作用

4
游戏编程(尤其是三维游戏编程,正如您所提到的)涉及许多“更高级”的数学知识。同样,在模拟系统(例如物理仿真)的任何项目中也需要运用这些知识。
加密学也使用不同形式的数学。

4

机器人技术需要扎实的矩阵知识,而人工智能则需要各种数学知识。


2

我是一名数学毕业生,必须说除了非常基本的算术,我只在理解/简化逻辑语句方面真正看到使用任何数学,例如等价于这两个语句的事情:

(!something) && (!otherThing)
!(something || otherThing)

除此之外,你只有在处理计算机图形或一些基于数学的学科(例如金融或计算)时才需要更复杂的数学知识 - 在这种情况下,了解数学更多地是为了理解你的学科而不是实际编程。

2

金融领域中有相当多复杂的数学计算。除此之外,还有用于三维图形的三角函数,我真的想不出还有什么了。

但我相信还有其他的东西。


2
许多看似非数学行业,例如制药(例如生物信息学)、农业、营销和一般的“商业智能”,都严重依赖统计学。系统性能、路由、调度、容错——清单还在不断增加……

我甚至曾被要求编写一种程序来优化将被回收的汽车的通知分发给二手车经销商。数学无处不在! - belwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接