編程需要知道多少數學知識?

摘要:許多人認為在開始學習編程之前必須對數學很在行或者數學分數很高。但一個人為了編程的話,需要學習多少數學呢? 實際上不需要很多 。這篇文章中我會深入探討編程中所需要的數學知識。

下面是我在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面骰。)

dungeons and dragons

要看攻擊者打防御者,讓攻擊者搖動一個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寫的程序:(下載代碼)

  1. import?random,?copy ?
  2. NUM_FIGHTS?=?1?
  3. VERBOSE?=?True?
  4. #?Lower?thac0?and?lower?ac?values?are?better.?Higher?damage?&?hp?values?are?better. ?
  5. aliceTemplate?=?{'name':?'Alice',?'hp':?14,?'ac':?5,?'thac0':?18,?'dmgnum':?1,?'dmgsize':6,?'dmgmod':?0} ?
  6. bobTemplate???=?{'name':?'Bob',???'hp':?12,?'ac':?7,?'thac0':?16,?'dmgnum':?2,?'dmgsize':4,?'dmgmod':?0} ?
  7. def?display(s): ?
  8. ????if?VERBOSE: ?
  9. ????????print(s) ?
  10. def?attack(attacker,?defender): ?
  11. ????if?random.randint(1,?20)?>=?attacker['thac0']?-?defender['ac']: ?
  12. ????????damage?=?0?
  13. ????????for?i?in?range(attacker['dmgnum']): ?
  14. ????????????damage?+=?random.randint(1,?attacker['dmgsize']) ?
  15. ????????damage?+=?attacker['dmgmod'] ?
  16. ????????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)) ?
  17. ????????defender['hp']?-=?damage?
  18. ????else: ?
  19. ????????display('%s?misses?%s.'?%?(attacker['name'],?defender['name'])) ?
  20. aliceWins?=?0?
  21. bobWins?=?0?
  22. for?i?in?range(NUM_FIGHTS): ?
  23. ????display('======================') ?
  24. ????display('Start?of?combat?#%s'?%?(i+1)) ?
  25. ????alice?=?copy.deepcopy(aliceTemplate) ?
  26. ????bob?=?copy.deepcopy(bobTemplate) ?
  27. ????while?True: ?
  28. ????????attack(alice,?bob) ?
  29. ????????if?bob['hp']?<=?0: ?
  30. ????????????break ?
  31. ????????attack(bob,?alice) ?
  32. ????????if?alice['hp']?<=?0: ?
  33. ????????????break ?
  34. ????if?alice['hp']?<=?0: ?
  35. ????????display('Alice?has?died.') ?
  36. ????????bobWins?+=?1 ?
  37. ????if?bob['hp']?<=?0: ?
  38. ????????display('Bob?has?died.') ?
  39. ????????aliceWins?+=?1 ?
  40. print() ?
  41. 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)))?

當運行這個程序時,你會看到:

  1. Start?of?combat?#1 ?
  2. Alice?misses?Bob. ?
  3. Bob?(12?hp)?hits?Alice?(14?hp)?for?6?points?of?damage.?Alice?is?reduced?to?8?hp. ?
  4. Alice?misses?Bob. ?
  5. Bob?misses?Alice. ?
  6. Alice?misses?Bob. ?
  7. Bob?misses?Alice. ?
  8. Alice?misses?Bob. ?
  9. Bob?misses?Alice. ?
  10. Alice?(8?hp)?hits?Bob?(12?hp)?for?5?points?of?damage.?Bob?is?reduced?to?7?hp. ?
  11. Bob?misses?Alice. ?
  12. Alice?misses?Bob. ?
  13. Bob?misses?Alice. ?
  14. Alice?misses?Bob. ?
  15. Bob?(7?hp)?hits?Alice?(8?hp)?for?2?points?of?damage.?Alice?is?reduced?to?6?hp. ?
  16. Alice?(6?hp)?hits?Bob?(7?hp)?for?6?points?of?damage.?Bob?is?reduced?to?1?hp. ?
  17. Bob?misses?Alice. ?
  18. Alice?(6?hp)?hits?Bob?(1?hp)?for?1?points?of?damage.?Bob?is?reduced?to?0?hp. ?
  19. Bob?has?died. ?
  20. Alice?won?1?(100.0%)?fights.?Bob?won?0?(0.0%)?fights.?

但是可能Alice正好在某一次戰斗中很幸運。讓我們關掉輸出再重新運行程序(在屏幕輸出比運行程序更耗時間),當戰斗次數達到30,000次時(將NUM_FIGHTS改成30000,VERBOSE變量變成False):

  1. Alice?贏得12909?(43.03%)次戰斗.?Bob贏得17091?(56.97%)戰斗。?

所以我們看到使用上面的數值,Bob稍稍占先。電腦進行了30,000次戰斗模擬。如果我們用筆和紙還有骰來進行30000次戰斗模擬的話,可能需要幾個月來算出結果,而我的筆記本僅用了8秒。

那么如果Alice的血點從14增加到20呢。誰會贏呢?

  1. Alice贏得19438?(64.79%)次戰斗.?Bob贏得10562?(35.21%)次戰斗.?

我們看到給Alice增加6點血點,結果倒過來了,Alice占先了。那么如果Alice的血點只是增加到16呢?

  1. Alice贏得15176?(50.59%)次戰斗啊.?Bob贏得14824?(49.41%)次戰斗.?

所以僅僅增加2個血點,就已經足夠扳回Bob更強攻擊力的勝算。

來看這個程序,它只用了加減乘除來計算一個百分比。甚至在更復雜的程序中,需要表示magic spells,治愈部位,多次攻擊,在戰斗中切換武器等不同效果時,我們也不需要知道更多的數學了。

當然,去學更多的數學吧。可以讓你成為更出色的程序員。但是為了學習編程需要多少數學?真的非常少。

更新:我想我應該在基本知識點中增加基本代數,但僅僅需要知道的如:果X*3=12,知道X等于4。

譯文來自:伯樂在線

原文鏈接:The “Invent with Python” Blog


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HDU 6071 Lazy Running

鏈接HDU 6071 Lazy Running 給出四個點1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;1和2&#xff0c;2和3&#xff0c;3和4&#xff0c;4和1之間有路相連&#xff0c;現在從2點出發&#xff0c;最后回到2點&#xff0c;要求路徑大于等于\(K\)&#xff0c;問路徑長度最…

vue彈窗插件實戰

vue做移動端經常碰到彈窗的需求, 這里寫一個功能簡單的vue彈窗 popup.vue <template><div class"popup-wrapper" v-show"visible" click"hide"><div class"popup-text">{{text}}</div></div> </temp…

【狂神說】Redis筆記

文章目錄1、Nosql概述1.1 為什么要用Nosql1.2 什么是NoSQL1.3 阿里巴巴演進分析2、NoSQL的四大分類3、Redis入門3.1 概述3.2 Windows安裝3.3 Linux安裝3.4 測試性能3.5 基礎的知識4、五大數據類型4.1 Redis-Key4.2 String&#xff08;字符串&#xff09;4.3 List&#xff08;列…

Postman用法說明

見&#xff1a;http://blog.csdn.net/flowerspring/article/details/52774399 Postman用法簡介-Http請求模擬工具 在我們平時開發中&#xff0c;特別是需要與接口打交道時&#xff0c;無論是寫接口還是用接口&#xff0c;拿到接口后肯定都得提前測試一下&#xff0c;這樣的話就…

位、字,字節與KB的關系?

位&#xff1a;我們常說的bit&#xff0c;位就是傳說中提到的計算機中的最小數據單位&#xff1a;說白了就是0或者1&#xff1b;計算機內存中的存儲都是01這兩個東西。 字節&#xff1a;英文單詞&#xff1a;&#xff08;byte&#xff09;&#xff0c;byte是存儲空間的基本計量…

C++ string 介紹

之所以拋棄char *的字符串而選用C標準程序庫中的string類&#xff0c;是因為他和前者比較起來&#xff0c;不必擔心內存是否足夠、字符串長度等等&#xff0c;而且作為一個類出現&#xff0c;他集成的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 進行賦…

Linux核心總結

文章目錄1.首先了解一下linux的目錄結構2.linux的基本命令之使用命令開關機3.linux的基本命令之目錄管理1.ls—列出目錄命令2.cd—切換目錄命令3.pwd—查看當前所在目錄命令4.mkdir—創建文件夾命令5.rmdir—刪除文件夾命令6.cp—復制文件命令7.rm—傳說中的刪庫跑路命令8.mv—…

Java多線程系列---“JUC鎖”01之 框架

本章&#xff0c;我們介紹鎖的架構&#xff1b;后面的章節將會對它們逐個進行分析介紹。目錄如下&#xff1a; 01. Java多線程系列--“JUC鎖”01之 框架02. Java多線程系列--“JUC鎖”02之 互斥鎖ReentrantLock06. Java多線程系列--“JUC鎖”03之 Condition條件07. Java多線程系…

IDEA配置jdk (SDK)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 提前安裝jdk&#xff0c;配置環境變量 一、配置jdk 1、依次點開File -->Project Structure&#xff0c;點擊左側標簽頁&#xff0c…

C、C++函數集 說明

第1章 數學函數 1.1 _chgsign——求參數的相反數 1.2 _copysign——復制數據 1.3 _hypot——求直角三角形斜邊長度 1.4 _max——求兩個數中的大數 1.5 _min——求兩個數中的小數 1.6 _scalb——求參數的(2^exp)倍數 1.7 abs——求整數的絕對值 1.8 acos——求…

讀書印記 - 《創新者的解答》

雖然作者寫書的意圖是教會大家如何完成顛覆式創新&#xff0c;但看完全書之后我覺得這個目標遠未達成&#xff0c;原因是作者的分析過于理論化&#xff0c;書中對于手機企業的發展建議即已被時間所否定。但如果標準放低&#xff0c;那這本書也確實總結出了不錯的顛覆式創新管理…

MinGW下編譯ffmpeg靜態庫給Visual C++使用

首先推薦 http://ffmpeg.zeranoe.com/builds/, 這里已經有編譯好的動態連接庫。可惜上面沒靜態鏈接庫。我也試過 DLL2Lib, 但是無法連接LIBCMT庫,只能使用MSVCRT 所以一定要靜態庫的話只能自己編譯了。在Windows上用MinGW編譯真是個痛苦的過程&#xff0c;沒有yum install和ap…

元模型是什么

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 元模型 元模型&#xff0c;是特定領域的模型&#xff0c;用于創建該領域中的模型的構建元素。典型的元模型結構可以分為四種&#xff1a;…

使用 NodeJS+Express+MySQL 實現簡單的增刪改查

關于node.js暫時記錄如下&#xff0c;以后有時間一定學習 文章來自簡書&#xff0c;作者&#xff1a;sprint&#xff0c;2016-07 使用 Node.js ExpressMySQL 實現簡單的增刪改查 https://www.jianshu.com/p/0a161f341771 使用 Node.js Express 開發服務端 https://www.jiansh…

zabbix安裝過程

安裝了兩天&#xff0c;zabbix監控服務器終于搭建好了。搭建過程中遇到過很多問題&#xff0c;都逐一解決了&#xff0c;好在有強大的網絡搜索&#xff0c;和網絡上牛人的優秀博客&#xff0c;讓我能夠不斷的解決問題。之前在虛擬機上裝過&#xff0c;覺得應該很簡單&#xff0…

Spring Data JPA入門

見&#xff1a;http://sishuok.com/forum/blogPost/list/7000.html Spring Data是什么 Spring Data是一個用于簡化數據庫訪問&#xff0c;并支持云服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷&#xff0c;并支持map-reduce框架和云計算數據服務。 Spring Data…

劃分用戶故事(user-story)的原則

在敏捷開發過程中是通過用戶故事來將需求具體化成可以進行迭代開發的一個個現實的可見的開發任務。因此在敏捷軟件的開發過程中&#xff0c;用戶故事的劃分對于迭代和開發起著舉足輕重的作用。 用戶故事從其名字來看是站在用戶的角度所描述的故事&#xff0c;同時也是用戶所能看…

【git】----- clone 及上傳文件

在GitHub上創建一個項目首先點擊新存儲庫進入創建的步驟創建完成后跳轉到下一個頁面復制路徑然后在自己的新建的文件夾里面&#xff08;例如:git&#xff09;右鍵&#xff0c;點擊Git Bash Here進入命令行輸入 git clone 輸入剛剛拷貝的路徑&#xff08;https://github.com/nam…

數據結構與算法總結

文章目錄線性數據結構1. 數組2. 鏈表2.1. 鏈表簡介2.2. 鏈表分類2.2.1. 單鏈表2.2.2. 循環鏈表2.2.3. 雙向鏈表2.2.4. 雙向循環鏈表2.3. 應用場景2.4. 數組 vs 鏈表3. 棧3.1. 棧簡介3.2. 棧的常見應用常見應用場景3.2.1. 實現瀏覽器的回退和前進功能3.2.2. 檢查符號是否成對出現…

使用 Spring Data JPA 簡化 JPA 開發

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 從一個簡單的 JPA 示例開始 本文主要講述 Spring Data JPA&#xff0c;但是為了不至于給 JPA 和 Spring 的初學者造成較大的學習曲線&am…