模擬+數學遞推+直覺來思考Leetcode飛機座位分配概率

2020-09-14 MyEncyclopedia

首發於公眾號MyEncyclopedia,定期發布AI,算法,工程類深度和前沿文章。學習本文的最佳姿勢為收藏本文,發送本文連結到桌面版瀏覽器,打開文末閱讀原文,敲入代碼運行。


Leetcode 1227 是一道有意思的概率題,本篇將從多個角度來討論這道題。題目如下

有 n 位乘客即將登機,飛機正好有 n 個座位。第一位乘客的票丟了,他隨便選了一個座位坐下。剩下的乘客將會:如果他們自己的座位還空著,就坐到自己的座位上, 當他們自己的座位被佔用時,隨機選擇其他座位,第 n 位乘客坐在自己的座位上的概率是多少?

示例 1:輸入:n = 1 輸出:1.00000 解釋:第一個人只會坐在自己的位置上。

示例 2:輸入: n = 2 輸出: 0.50000 解釋:在第一個人選好座位坐下後,第二個人坐在自己的座位上的概率是 0.5。

提示:1 <= n <= 10^5

假設規模為n時答案為f(n),一般來說,這種遞推問題在數學形式上可能有關於n的簡單數學表達式(closed form),或者肯定有f(n)關於f(n-k)的遞推表達式。工程上,我們可以通過通過多次模擬即蒙特卡羅模擬來算得近似的數值解。

Monte Carlo 模擬發現規律

首先,我們先來看看如何高效的用代碼來模擬。根據題意的描述過程,直接可以寫出下面代碼。seats為n大小的bool 數組,每個位置表示此位置是否已經被佔據。然後依次給第i個人按題意分配座位。注意,每次位置隨機數範圍在[0,n-1],因此,會出現已經被佔據的情況,此時需要再次隨機,直至分配到空位。

暴力直接模擬

def simulate_bruteforce(n: int) -> bool:    &34;&34;&34;    seats = [False for _ in range(n)]    for i in range(n-1):        if i == 0:   i-th has his seat                seats[i] = True            else:                while True:                    rnd = random.randint(0, n - 1) 34;&34;    Simulates one round of complexity O(N).    :param n: total number of seats    :return: True if last one has last seat, otherwise False    &34;& for each person, the seats array idx available are [i, n-1]    for i in range(n-1):        if i == 0:   i-th still has his seat                pass            else:                rnd = random.randint(i, n - 1)  34;&34;    Simulates one round of complexity O(N).    :param n: total number of seats    :return: True if last one has last seat, otherwise False    &34;& for each person, the seats array idx available are [i, n-1]    for i in range(n-1):        if i == 0:   i-th still has his seat                seats[i] = True            else:                # 0 must not be available, now we have 0 and [i+1, n-1],                rnd = random.randint(i, n - 1)                if rnd == i:                    seats[0] = True                else:                    seats[rnd] = True    return not seats[n-1]


著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

相關焦點

  • 數學反常識,不能亂猜的直覺與結論
    原標題:數學反常識,不能亂猜的直覺與結論 數學上有很多很多這樣的例子:以為很簡單的問題其實是很難的難題;有時候做著做著就忘了某些定理成立的條件;一些看似簡單的方程卻存在一些奇特的解的形態,不考慮條件概率和 Bayesian 定理從而相信各種偽科學……說得極端點,在受過教育之前
  • 通過數學計算表明,我們生活在模擬世界中的概率是接近1
    「你只需要給每一個模型分配一個先驗概率,」基平說。「我們只是假定了無差異原則,這是當你沒有任何數據或任何傾向時的默認假設。」這是因為當模擬產生更多的模擬時,可供每一代子孫使用的計算資源就會減少到這樣的程度:絕大多數實相將沒有必要的計算能力來模擬後代現實,而後代現實有能力託管有意識的生命。把所有這些代入貝葉斯公式,就會得到答案:我們生活在基礎現實中的後驗概率幾乎與我們是一個模擬的後驗概率相同。
  • 概率論中的一些反生活直覺問題
    有一些問題會反直覺,比如說:在一個盒子裡有10張卡片,只有一張是有獎的,若干人依次從中各取一張不放回,問每個人中獎的概率與抽獎的順序有關嗎?某超市有獎銷售,一共有n張卡片,只有2張是有獎的,則第k個人中獎的概率與第一個人中獎的概率一樣嗎?
  • 考研數學|難點突破!遞推數列單調有界原理方法之有界性證明
    大家好,我是老梁考研數學!遞推數列極限存在的證明及計算是考研數學的一個重要考點,同時也是難點。在歷年考研數學真題中,常常是高等數學部分中的壓軸題,很少有同學能夠全身而退!老梁考研數學計劃通過幾篇文章對遞推數列極限存在證明與計算的方法做一詳細講解,幫助同學們突破難點,掌握方法,順利地解決考研數學的這類題型。考研數學對遞推數列極限存在性證明方法的考查主要是「單調有界原理」。在極限存在證明中主要要做兩件事:一是證明數列的單調性,二是證明數列的有界性。本篇重點介紹證明遞推數列極限存的單調有界原理之有界性證明的思路和方法。
  • 直覺去了哪裡?
    30年前這一問題被美國一知名雜誌刊登後引發了熱議,因為直覺告訴我們換不換都是一樣的,但答題人選擇換。數學愛好者、專業人士紛紛加入討論,進行了一場曠日持久的論戰,還發展出了諸多變種。現在讓我們來回顧一下這道經典問題,來看看直覺到底哪出錯了,信息又是如何影響結果的。
  • 我們為什麼不能相信直覺?:讀《反直覺思考》
    《反直覺思考》說的就是這個問題。人類社會發展到如今,現實的增速超過了思維的進化速度,所以在這個時代,大家都感到迷茫、不知所措,其根源就在於大腦的「默認設置」已經無法適應新時代的要求。在《反直覺思考》中,作者將「默認設置」稱之為「直覺思考」,並認為我們需要在這個時代重啟大腦、升級「軟體的版本」,也就是我們需要反直覺型的思考。
  • 我們生活在模擬世界中嗎?專家稱概率是50%
    因此,該三難命題將一個物理假設(沒有模擬環境)和模擬假設(有一個基本現實,也有模擬環境)對立起來,你只需對每個假設模型分配一個先驗概率。基平說:「我們只是假設了無差異原則,這是當你沒有任何數據或者傾向性觀點時的默認假設。」  所以每個假設的先驗概率都是50%,就像人們要拋硬幣來決定賭注一樣。
  • 硬幣到底是正面還是反面,關於貝葉斯概率的思考
    歷史文章回顧:心理經濟學之常見概念說明心理經濟學之二 直覺思維和理性思維行為經濟學中反直覺的概率故事吸菸和禽流感哪個危害更大--被忽略的基礎比率貝葉斯定理,讓你「大吃一驚」的概率前一篇文章已經介紹了貝葉斯定理的概念,並且舉例說明貝葉斯定理的反直覺之處。那麼貝葉斯定理是否是否就是萬能的呢?世界真的都是反直覺的嗎?
  • 一文教你如何在飛機上選擇最適合自己的座位,飛機選座小妙招
    在發今天這篇文章之前,我聽過也收到過不少關於飛機座位的抱怨,注意是抱怨,抱怨什麼呢?有人說他坐的地方噪音太大,有人說上廁所走出去很不方便……今天我們就來聊一聊飛機選座的這些事其實很多人坐飛機都沒有選座位的概念,基本是默認機選座位,也就是系統隨機分配座位所以就出現了上面的一些問題。
  • 三門問題:直覺究竟去了哪裡?
    30年前這一問題被美國一知名雜誌刊登後引發了熱議,因為直覺告訴我們換不換都是一樣的,但答題人選擇換。數學愛好者、專業人士紛紛加入討論,進行了一場曠日持久的論戰,還發展出了諸多變種。現在讓我們來回顧一下這道經典問題,來看看直覺到底哪出錯了,信息又是如何影響結果的。
  • 病毒在飛機上的傳播概率多大?一張示意圖帶你看清
    如果飛機上的病人打了一個噴嚏,意味著什麼?美國Ansys公司利用計算機仿真系統,模擬了噴嚏微粒在機艙中的傳播過程。乘客的一個噴嚏,會將帶有細菌和病毒的飛沫高速噴射到空氣中。
  • 數學哲學:對數學的思考
    在數學哲學和邏輯中,直覺主義,或者新直覺主義 (對應於前直覺主義),是用人類的構造性思維活動進行數學研究的方法。也可翻譯成直觀主義。任何數學對象被視為思維構造的產物,所以一個對象的存在性等價於它的構造的可能性。這和古典的方法不同,因為根據古典方法,一個實體的存在可以通過否定它的不存在來證明。
  • 力學博士稱飛機最安全座位難預測 空難時姿態各異
    飛機最安全的座位在哪裡  每一次坐飛機,我都會裝得淡定自如。  這次飛機事故發生後,身邊的朋友又開始討論一個話題:「飛機上最安全的座位在哪裡?」作為「飛機座位選擇焦慮症」患者,我迫不及待地想找到答案。  一場模擬客機墜毀的實驗,或許會讓我解開謎團。2012年,美國探索頻道花費100萬英鎊,進行了這場實驗。除了乘客是氣墊人,整個墜毀過程都是真實的。
  • 飛機上座位如何選?坐哪兒最舒服?幾點建議請收藏!
    靈魂拷問:飛機上坐哪裡最舒服?言歸正傳。現在大家坐飛機出行已經很普及了,但總的來說機會還是沒有坐車多。好不容易坐一回飛機,選個好座位讓自己在旅途中更加舒適也是準備工作之一。很多航空公司也會提供自選座位的服務,那到底飛機上坐哪裡最舒服呢?
  • 考研數學模擬考,究竟有點啥用處?
    很多備考數學的小可愛這段時間都在問,什麼時候開始模擬考合適?關於這個問題,我們要先確定一下模擬考的意義究竟在哪裡,對我們的好處究竟是什麼?怎麼參加模擬考才能讓我們高效參考,並且考有所獲?其實要說數學模擬,這樣的考試有兩種區分,一種是自己規定時間,把模擬套或者真題卷當考捲來模擬考試,另一種是市面上組織的模擬考試,下面我們分開來說。如果是第一種的話,可以說是非常有用而且非常有必要的。
  • 概率問題丨找東西背後的概率!
    提示:點擊上方"上海四季教育"↑即可關注我們各種違反常理的錯覺圖片和數學事實告訴我們,直覺並不可靠
  • 經典概率題,著名的反直覺問題——百囚徒挑戰
    很多時候,我們都會靠直覺去評價一件事情,但很多時候,我們的直覺是錯的,哪怕感覺有多麼準確,而最著名的反直覺問題,就是百囚徒挑戰。案例和問題監獄決定給關押的100名囚徒一次特赦的機會,條件是囚徒通過一項挑戰。
  • 直覺主義——數學概念是自主的智力活動
    直覺主義的哲學思想來自康德。它特別強調人的直覺對數學概念的作用。布勞威爾:構造出的自然數作為直覺主義學派的創始人和代表人物,布勞威爾提出了他對數學對象的看法。自然數怎麼來的呢?他認為是靠人直觀地理解從1開始每次加1這個過程。也就是反覆領會這麼一串符號:|,||,|||,||||,|||||,…當然,也可以是*,**,***,****,…他認為,人確實具有先天的直覺能力,能肯定這樣能一個一個地把自然數構造出來。因此,數學對象是人靠智力活動構造出來的。
  • LeetCode面試系列 第6天:No.9 - 迴文數
    今天我們來分析一道相對輕鬆的字符串面試題吧,恰好大家從Python 100天中學到的字符串知識可以派上用場。Leetcode今天要給大家分析的面試題是 LeetCode 上第 9 號問題,LeetCode - 9.
  • 乘飛機時選哪些座位較好?
    乘飛機時選哪些座位較好?隨著人們生活水平的提高,有越來越多的人選擇飛機出行。那麼,在搭乘飛機的時候,如何選擇座位?飛機各部分的座位,有哪些優點和缺點呢?在購買機票前,可以先看看有關飛行的影視劇。我們重點介紹經濟艙各個部分座位的優點和缺點。一、靠窗座位:大家都愛選擇靠窗座位,因為能看風景。但全經濟航班中,一般從第6排到第13排(選座號碼為:36排—42排),是機翼上端,靠窗只能看到機翼和天空,看不到地面。而且,從第35排——第43排,離飛機發動機很近,噪音很大。另外,靠窗的座位,通常相對中間和考靠過道的座位,空難時候,生命危險係數稍大些。