淘宝内部卷网站怎么做,怎么把自己做的网站让外网访问,镇海区建设工程安监站网站,删除织梦综合网站摘要#xff1a;许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话#xff0c;需要学习多少数学呢#xff1f; 实际上不需要很多 。这篇文章中我会深入探讨编程中所需要的数学知识。 下面是我在reddit的子论坛 r/learnprogramming 看到的…摘要许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话需要学习多少数学呢 实际上不需要很多 。这篇文章中我会深入探讨编程中所需要的数学知识。 下面是我在reddit的子论坛 r/learnprogramming 看到的几个帖子:
“要成为一个优秀的程序员需要学习多少数学”“我应该重新学习数学吗”“这可能是我提问过的最愚蠢的一个问题。成为一个优秀的程序员究竟需要学习多少数学”
数学和编程有一种容易让人误解的联系。许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话需要学习多少数学呢
实际上不需要很多。这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。
对于基本的编程你需要知道下面的
加减乘除—实际上电脑会帮你作加减乘除运算。你仅需要知道什么时候运用它们。模运算—模运算是用来计算余数它的符号通常用%百分号来表示。所以23除以7等于3余数是2。23 mod 7 2。判断是奇数还是偶数的模运算—如果你想知道一个数是奇数还是偶数用它mod 2来作模运算。如果结果是0它就是偶数。如果结果是1就是奇数。23 mod 2等于1所以23是奇数24 mod 2等于024是偶数。对一个数作百分数运算就是用这个数来乘以一个百分数。譬如你要得到279的54%就是用0。54*279。这就意味着为什么1.0等于100%0.0等于0%。知道负数是什么。负数乘以负数等于正数。负数乘以正数等于负数。就这么简单。知道卡迪尔坐标系统。在编程中0,0代表屏幕左上角Y坐标的正轴往下。知道勾股定律因为它是用来计算笛卡尔坐标中两点之间的距离的。勾股定律a^2^2c^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值越低攻击越准。武器的攻击力用类似1d62来表示它表示摇一个六面骰得到的值然后再加2。2d4就是摇2个4面骰然后将它们相加。“龙与地下城”采用的是4681012和20面骰。 要看攻击者打防御者让攻击者摇动一个20面骰。如果这个数字大于或等于攻击者的THAC0减去防御者的防御能力那么这个攻击就成功防御者将受到伤害。不然防御者就阻击了这个攻击并且不费血。
我们假设两个人物Alice和Bob她们具有以下值
AliceHP 14AC 5THAC0 18DAMAGE 1d6BobHP 12AC 7THAC0 16DAMAGE 2d4
所以Alice有更多的血点和防御力记住AC越低越好。但是Bob更可能成功击中对方记住THAC0越低越好并造成更多的伤害。我们说Bob的攻击力更强是因为2d4可以造成2-8点伤害而Alice的1d6只能造成1-6点伤害。如果你懂统计学你可以计算出Bob的期望伤害值是5比Alice的3.5要高。
你会打赌Alice或者Bob会赢得比赛对吗很难讲谁会赢他们看起来势均力敌。尽管可能你的统计学学得很好但做这个计算将会十分头疼。编写“龙与地下城”的程序模拟战斗过程你甚至不需要知道统计学。仅仅需要运行几百次或者几千次战斗看看谁赢得更多。
下面是用Python写的程序下载代码
import random, copy NUM_FIGHTS 1 VERBOSE True # Lower thac0 and lower ac values are better. Higher damage hp values are better. 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} def display(s): if VERBOSE: print(s) def attack(attacker, defender): if random.randint(1, 20) attacker[thac0] - defender[ac]: damage 0 for i in range(attacker[dmgnum]): damage random.randint(1, attacker[dmgsize]) damage attacker[dmgmod] display(%s (%s hp) hits %s (%s hp) for %s points of damage. %s is reduced to %s hp. % (attacker[name], attacker[hp], defender[name], defender[hp], damage, defender[name], defender[hp] - damage)) defender[hp] - damage else: display(%s misses %s. % (attacker[name], defender[name])) aliceWins 0 bobWins 0 for i in range(NUM_FIGHTS): display() display(Start of combat #%s % (i1)) alice copy.deepcopy(aliceTemplate) bob copy.deepcopy(bobTemplate) while True: attack(alice, bob) if bob[hp] 0: break attack(bob, alice) if alice[hp] 0: break if alice[hp] 0: display(Alice has died.) bobWins 1 if bob[hp] 0: display(Bob has died.) aliceWins 1 print() print(Alice won %s (%s%%) fights. Bob won %s (%s%%) fights. % (aliceWins, round(aliceWins / NUM_FIGHTS * 100, 2), bobWins, round(bobWins / NUM_FIGHTS * 100, 2)))
当运行这个程序时你会看到
Start of combat #1 Alice misses Bob. Bob (12 hp) hits Alice (14 hp) for 6 points of damage. Alice is reduced to 8 hp. Alice misses Bob. Bob misses Alice. Alice misses Bob. Bob misses Alice. Alice misses Bob. Bob misses Alice. Alice (8 hp) hits Bob (12 hp) for 5 points of damage. Bob is reduced to 7 hp. Bob misses Alice. Alice misses Bob. Bob misses Alice. Alice misses Bob. Bob (7 hp) hits Alice (8 hp) for 2 points of damage. Alice is reduced to 6 hp. Alice (6 hp) hits Bob (7 hp) for 6 points of damage. Bob is reduced to 1 hp. Bob misses Alice. Alice (6 hp) hits Bob (1 hp) for 1 points of damage. Bob is reduced to 0 hp. Bob has died. Alice won 1 (100.0%) fights. Bob won 0 (0.0%) fights.
但是可能Alice正好在某一次战斗中很幸运。让我们关掉输出再重新运行程序在屏幕输出比运行程序更耗时间当战斗次数达到30000次时将NUM_FIGHTS改成30000VERBOSE变量变成False
Alice 赢得12909 (43.03%)次战斗. Bob赢得17091 (56.97%)战斗。
所以我们看到使用上面的数值Bob稍稍占先。电脑进行了30000次战斗模拟。如果我们用笔和纸还有骰来进行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*312知道X等于4。
译文来自伯乐在线
原文链接The “Invent with Python” Blog