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

2021-01-14 愛開發


下面是我在Reddit的子論壇 r/learnprogramming 看到的幾個帖子:


數學和編程有一種容易讓人誤解的聯繫。許多人認為在開始學習編程之前必須對數學很在行或者數學分數很高。但一個人為了編程的話,需要學習多少數學呢?


(【伯樂在線編注】:本文僅為 Al Sweigart 一家之言,再推薦 Alan Skorkin 的這篇文章《數學是成就卓越開發人員的必備技能》。點擊「閱讀原文」可閱讀全文)


實際上不需要很多。這篇文章中我會深入探討編程中所需要的數學知識。你可能已經都知道了。


對於基本的編程,你需要知道下面的:


加減乘除 — 實際上,電腦會幫你作加減乘除運算。你僅需要知道什麼時候運用它們。

模運算 — 模運算是用來計算餘數,它的符號通常用%百分號來表示。所以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 + b^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圖像,物理或者加密的數學。你只需要學習運用軟體庫就行了。


編程需要學習什麼?


你需要學習的是如何建模和設計算法。這意味著,如何將真實世界的運算或者數據處理抽象出來,寫出代碼,讓計算機來幫你運算。例如,在遊戲「龍與地下城」(Dungeons and Dragons)中,角色和怪獸都有許多不同的戰鬥統計值:







要看攻擊者打防禦者,讓攻擊者搖動一個20面骰。如果這個數字大於或等於攻擊者的THAC0減去防禦者的防禦能力,那麼這個攻擊就成功,防禦者將受到傷害。不然,防禦者就阻擊了這個攻擊,並且不費血。


我們假設兩個人物,Alice和Bob,她們具有以下值:




所以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' % (i+1))

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正好在某一次戰鬥中很幸運。讓我們關掉輸出再重新運行程序(在屏幕輸出比運行程序更耗時間),當戰鬥次數達到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。

原文:http://inventwithpython.com/blog/2012/03/18/how-much-math-do-i-need-to-know-to-program-not-that-much-actually/

翻譯:伯樂在線 – 唐小娟



回復「1」,獲取Android酷炫實用的開源框架(UI框架)

回復「2」,獲取Google將不再支持Android Eclipse Tools

回復「3」,獲取小處顯逼格!APP界面如何在細節上提升氣質?

回復「4」,獲取Android終於官方支持按百分比來設置空間的寬高了

回復「5」,獲取最全最強解析:支付寶錢包系統架構內部剖析(架構圖)

回復「6」,獲取【源碼】jiandan煎蛋—高仿也如此的專業

回復「7」,獲取【乾貨】源碼《在路上》and《高仿淘寶客戶端》

回復「8」,獲取2015中國程式設計師生存報告,你苦你先看

回復「9」,獲取如何給你的Android安裝文件(APK)瘦身

回復「0」,獲取Google技術開發指南,給大學生自學的建議




相關焦點

  • 編程需要知道多少數學知識?你有一把錘子,你會把一切看成是釘子
    數學和編程有一種容易讓人誤解的聯繫。許多人認為在開始學習編程之前必須對數學很在行或者數學分數很高。但一個人為了編程的話,需要學習多少數學呢? 這篇文章中我會深入探討編程中所需要的數學知識。你可能已經都知道了。
  • 西門子編程中的數學運算:運算符
    西門子編程,一般的程序都是由G0,G1等基礎代碼組成,但是遇到更高精度的機加工工件,往往需要更高級的編程思路,那麼數學知識是必不可少的。上學我們學過的那個函數,你還記得多少,代數、幾何可曾都還記得,在一些比較高級的程序中,往往會夾雜的數學知識,像勾股定理、餘角、互餘、互補等等,這些經常會用到,下面總結下西門子常用的一些運算符:SIN 正弦ASIN 反正弦 COS 餘弦 ACOS 反餘弦 TAN
  • 在數據科學領域中,你需要多少數學知識?
    引言如果你有心學習數據科學,那麼你一定會在腦海中想過下面的問題:沒有或者只有很少的數學知識,我能做一個數據科學家嗎?數據科學必需的數學工具有哪些?有很多優秀的包可用於建立預測模型或者數據可視化。在此之前,我們需要問一下自己下面的這些問題:">我的數據集有多大?我的特徵變量和目標變量是什麼?什麼預測特徵與目標變量關聯性最大?什麼特徵是重要的?我需要量化特徵值嗎?我的數據集應該如何分成訓練集和測試集?什麼是主成分分析(PCA)我應該用PCA移除多餘特徵嗎?我要如何評估我的模型?用R2,MSE還是MAE?我應該如何提升模型預測的能力?
  • 大數據應用在哪些領域 需要知道什麼核心知識
    需要知道什麼核心知識?大數據的魅力不在於吸引了很多身處網際網路圈的程式設計師,更是吸引了很多圈外的人開始學習大數據。零基礎能學大數據嗎,需要知道什麼核心知識?想要學習大數據技術,還是要有一定的基礎的,大數據不是一門簡單的學科,需要學習的方面有很多,如:數學、英語、編程基礎等等!
  • 「數控技術」專業:想學會「數控編程」,需要具備哪些知識?
    關於數控加工技術很多人都認為關鍵是編程。關於數控編程有兩種層面理解。一種是具備較好的機械加工知識和經驗的基礎上編程,這種編程考驗更多的是工藝和經驗。另一種是不考慮機械加工知識和經驗,只是單純的會編程。今天我們單從會編程的角度來分析一下學習編程要具備哪些知識。
  • 學編程需要什麼基礎?
    學編程需要什麼基礎? 1、數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是由數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,初學者有高中水平就差不多了。
  • 0基礎學編程需要什麼基礎?
    01 學編程需要什麼基礎? 學編程需要一定的基礎,這樣講是說明,有基礎可以快速的上手掌握。但並不是代表沒有基礎就不可以學編程。 對於0基礎的人來講,自學是有一定難度的,沒有人引導,容易卡在某一個問題上,長久得不到進展,或者進展緩慢,最可能的結果就是從入門到放棄。0基礎學編程還是需要老師的引導,才可以快速上道。
  • 學Python編程為什麼會對學好數學有幫助呢?
    前面我們知道了Python的創始人是荷蘭人吉多·范羅蘇姆,Python語言是在ABC語言的基礎上創建的新的程式語言,由此可見Python語言本身就與數學密切相關。我們再來看一看編程與數學的關係。我們學習數學不只是要認識數字,會寫會算,還要能通過學過的數學知識解決現實中存在的問題,將現實生活中的問題轉化為數學問題並予以解決。這就要求對現實生活中的問題進行數學建模,並驗證模型的正確性。數學模型的實現與驗證一般都是通過計算機編程來實現。
  • 「關於學習編程那些事」我們需要學習的是編程,而不是程式語言
    解決問題的是計算機科學,而不是編程。這就是為什麼許多CS的學生似乎不明白自己為什麼要學習算法和數學。如果之前你有去上過CS的課程,你就不會對我這裡說的話感到驚訝。因為你會注意到編程和程式語言沒有多大的關係。
  • 教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量
    因為我們要寫的是3D遊戲程序,所以,我們必須要接觸兩個數學方面的難點知識——向量和矩陣。有的人問:這個這麼難,我們可不可以不學?我的答案是這樣的:如果你是有心要學習本課程,那麼這個是必須要學習的,是沒有道理可講的,是想破了腦袋也要學明白的。
  • 多數語言ai方向不需要數學基礎
    謝邀我就是搞人工智慧的我們現在都是用deeplearning4j實現了slam機器學習、深度學習、離散數學、圖形圖像處理、計算機視覺、自然語言處理、資料庫、人工智慧算法基礎學科。只要是計算機相關的,如數學,如工科轉專業的,都要求要學習一下數學。因為這些都會有用,目的就是為了以後的學習做準備。人工智慧對基礎學科要求低於算法工程師。編程基礎謝邀,不同行業不同專業。
  • 重點了解數學各科的基本知識就好了
    重點了解數學各科的基本知識就好了人工智慧領域發展到現在,已經基本不太需要什麼數學基礎了,你只要從最簡單的入手,找幾本算法和數據結構的書籍啃下來,基本上入門也就差不多了。個人認為語言上要找幾門腳本語言了解熟悉一下即可,現在很多數據科學的項目也基本不用腳本語言,主要的還是編程的思想。數據結構和算法分析暫時不需要去看,暫時入門只要會一些模型的推導都可以。目前,主流開源數據處理系統spark、flink等已經不需要數學基礎了,甚至只要是統計專業的就可以。
  • 程式設計師需要多少英語和數學基礎?
    程式設計師需要多少英語和數學基礎?說起轉行做程式設計師,很多朋友就又要問了:程式設計師是不是英語和數學都特別好?總的來說,根據崗位和等級的不同,所需要的基礎也不一樣。英語對於程式設計師來說,英語的主要用途有:1.閱讀英文原文的手冊、資料和論文。
  • 小創客編程營《Python數學思維趣味編程(2)》
    編程知識已應用到我們的日常生活中,如小遊戲、機器人、無人超市等。學習編程,可以提高解決思考和邏輯問題的能力,特別是鍛鍊大腦開發和思維能力,讓孩子「像科學家一樣思考,像工程師一樣解決問題」。「小創客編程營」邀請編程專家,每月選取一個主題與數學、語文、英語、藝術、科學等多個學科結合為小讀者帶來一系列課程帶領大家一起體驗編程的無窮魅力本期編程課主題為《Python數學思維趣味編程(2)》對編程感興趣的小讀者們千萬別錯過這次機會趕快訂票參與吧
  • 小創客編程營《Python數學思維趣味編程(1)》
    編程知識已應用到我們的日常生活中,如小遊戲、機器人、無人超市等。學習編程,可以提高解決思考和邏輯問題的能力,特別是鍛鍊大腦開發和思維能力,讓孩子「像科學家一樣思考,像工程師一樣解決問題」。「小創客編程營」邀請編程專家,每月選取一個主題與數學、語文、英語、藝術、科學等多個學科結合為小讀者帶來一系列課程帶領大家一起體驗編程的無窮魅力本期編程課主題為《Python數學思維趣味編程(1)》對編程感興趣的小讀者們千萬別錯過這次機會趕快訂票參與吧
  • 零基礎學習Java程式語言需要知道的4個知識要點
    很多Java編程初學者在剛接觸Java語言程序的時候,不知道該學習掌握哪些必要的基礎知識。下面千鋒廣州Java小編就說說Java零基礎學習Java程式語言基礎知識的幾個要點,希望能夠對Java編程基礎入門學習的新手有幫助。一、先明白了解什麼是Java的四個方面。
  • 和碼編程採用「編程+數學」差異化定位,邁入編程教育的第一陣營
    和碼編程首創了「數學+編程」的差異化定位,編程作為一種技能,學科作為知識體系,推出數理編程課,提升孩子數理思維,同時讓孩子掌握編程技能。「這是和碼編程作為少兒編程行業的晚入局者,卻能呈指數增長的重要原因。」
  • 機器人編程融合多學科知識
    而編程,聽起來就很酷,利用編程生產產品開發遊戲,這可比玩遊戲要酷多了!當然,會編程的孩子,也將成為孩子群體中的超級巨星。機器人編程是融合了多學科知識的課程。計算機科學發展到今天,在人機協作系統深入人類社會方方面面的今天,少兒編程將會成為一個基礎性學科,甚至人文、藝術都可以基於它有延伸和融合。少兒編程課程可以非常好的融合數學學科、生物學科、科學學科,也可以非常好的融合遊戲、語文戲劇等,少兒編程課程的創造性是無窮的。如果你把會編程的孩子當作小碼農,那是一種窄化思維。
  • 學界丨一文讀懂機器學習需要哪些數學知識---附精品資源
    一文讀懂機器學習需要哪些數學知識0.前言本篇文章是由留德華叫獸 在知乎的優秀回答改編擴展而成的, 作者留德華叫獸有著應用數學和碩士運籌學、優化理論的背景轉到德國海德堡大學讀博,主要從事機器學習但是不可否認數學是自然科學領域探究真理的有效工具,有了強大的數學背景知識會讓你看待問題更加深刻,這就是我們經常會看到很多大牛們都是出身數學專業。另外本文所列舉的課程比較多,要想一下子去窮盡所有課程顯然也不現實,大可不必打好所有的數學基礎再去學機器學習,最好的做法是當你對機器學習本身的理解達到一定瓶頸的時候,你可以補一補一些相關的數學基礎之後再回去看機器學習的問題也許會更快的有所突破。
  • 程式設計師怎樣學數學?
    甚至於以前是主修數學的程式設計師也告訴我他們真的不是常常使用到數學!他們說 更重要的是要去了解設計模式,面向對象原理,軟體工具,界面設計,以及一些其他類似的東西。 你了解嗎?他們完全正確。你不需要了解很多數學你就能做個很棒,很專業的程式設計師。 但是呢,同時你也不是真的需要知道如何來編程。