介紹
在某個時間點,您可能聽說過中獎彩票的機會非常渺茫。就像所有與機率相關的事情一樣,多次試驗可能會導致結果對你有利。現在,如果你參加很多次彩票,你中獎的機會會更大一些,這取決於你參加了多少次彩票。這仍然不能保證你最終會中獎,但是是均勻分佈的,並根據大數定律(在本例中意味著大量彩票),我們可以得出相對更有可能的可能性。
重要的是要了解,每個新彩票都是獨立於其他彩票的,並且相同的彩票“彩票號碼”可以贏得許多不同的彩票(遵循大數定律)。您也可能會運氣不好,無論您嘗試了多少次,每次都選錯了號碼。您現在有兩個選擇:
- 您每次都可以嘗試隨機數字。
- 您每次都可以嘗試相同號碼。
理論上(和數學上),這兩種情況發生的可能性相同。然而,場景 2 會帶給你輕微的優勢。隨著次數接近無窮大,最終每一個數字都會被選中。問題是,對於場景 1,您需要嘗試更多次,希望您當時選擇的數字與獲勝的數字相符。在情境 2 中,您確信隨著試驗趨於無限,您的數字將在某個時刻「獲勝」。對於本博文,我們將使用場景 2。
那麼,在我告訴你答案之前,你認為你能回答這個問題嗎?
「如果您周圍的所有彩票都有正好100 萬人的老虎機,並且您為每個玩過的人都選擇了同一張彩票[x],那麼您需要玩多少張彩票才能最終成為中獎者?
答案是...
1440萬次。
這篇文章的其餘部分將介紹我如何得出該值、如何進行模擬以及一些注意事項。從這裡開始事情會變得更加技術化。
100萬人的彩券號碼範圍為1 - 1,000,000(或0 - 999,999)。玩家每次抽獎只能選擇該範圍內的號碼,中獎彩券也只能來自該範圍。本質上,我們可以說我們將擁有一組 100 萬個數字。
考慮到使用者可以選擇該範圍內的任何數字,我們需要滿足集合中的每個項目至少被擊中一次的條件。這是因為,如果每個號碼至少被叫過一次,那麼它將涵蓋玩家可能選擇的任何可能的票號。這也意味著我們不關心每個數字運行了多少次,從而使「集合」成為用於我們的模擬的理想 Python 資料結構。我們將從一個空集合開始,並在每次迭代時用隨機生成的數字填充它,直到該集包含指定範圍內的每個數字。由於 Python 集合不重複數字,因此我們不必擔心確保唯一性。
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>對於 1,000,000 人的彩票,函數調用如下:calculate_lottery_chances(1000000),它將返回中獎之前嘗試彩票的次數。以這種方式排列程式碼使其具有很強的可擴展性。 </p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637690021.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <h2> 問題 </h2> <p>簡單來說,問題的根源就是「變異」。第一次運行該函數時,我得到了“1310 萬”次作為我的值。我重新運行了一下,得到了大約 1390 萬的結果。我這樣做了更多次,得到的答案差異很大——在某個時候,我得到了 1500 萬個。很明顯,我需要這樣做並找到平均值。按照目前現有的模式,我認為隨著平均迭代次數趨於無窮大,我將更接近得到<strong>一個</strong>可靠的答案。需要一些可以做到這一點並且快速完成的東西,這促使我編寫了這個函數:<br> </p> <pre class="brush:php;toolbar:false">def average_over_n_times(function, function_arg, n): """ This returns the average of the returned value of a function when it is called n times, with its (one) arg """ total = 0 for x in range(0, n): total += function(function_arg) return round(total/n)
隨後,所有內容都會被修補為:
num_of_trials = average_over_n_times(calculate_lottery_chances, lottery_players_count, n)
其中「n」表示結果平均的次數。然而,這帶來了另一個問題,我們將在下一節中討論。
「n」應該是什麼?
n 的值越大,結果越接近「平均情況」。然而,考慮到仍然沒有絕對性或確定性,執行這一系列任務太多次就會失去生產力。我這麼說有以下原因:
- 時間不是無限的,我們不能無限期地執行這些計算,這意味著每次運行時總會有變化(無論多小),這違背了「絕對」的想法。
- 計算資源是有限的。
- 這個實驗的假設之一是電腦產生的「隨機性」可以準確地模擬現實。
- 就像演算法運行時一樣,較小的幅度不再與較大的幅度一樣重要。當處理大於 13,000,000 的值時,大約 100,000 的變化就不會那麼顯著。
牢記這些,我用以下值測試了「n」:10、20、30、50、100、1000 和 5000 次。
PyTorch 從何而來?
此時,您可能想知道為什麼部落格標題中沒有提到「PyTorch」一詞。好吧,雖然我提到用不同的值測試 n,但它與我用於所有測試的程式碼並不相同。
這些都是計算量很大的實驗,我的 CPU 跟我說了一句話。我之前分享的程式碼片段是在一個具有零外部包依賴性的文件中編寫的,並且該文件在 bash shell 中運行,並在前面添加了 time 命令來追蹤執行時間。以下是僅使用 CPU 時的執行時間:
n | Time (min and sec) |
---|---|
10 | 1m34.494s |
20 | 3m2.591s |
30 | 5m19.903s |
50 | 10m58.844s |
100 | 14m56.157s |
在 1000 時,我無法再讓程式運作了。我不確定是不是中途斷了沒能停止執行,但我在4小時57分鐘後取消了。我認為有幾個因素影響了這一點,我將在「注意事項」部分中討論這些因素。不管怎樣,我的風扇噪音很刺耳,我知道我可能已經把筆記型電腦功率適中的 CPU 推得有點太多了。我拒絕接受失敗,在思考如何至少運行 4 位元迭代時,我想起了一位使用 PyTorch 的朋友告訴我的話:
「GPU 在運算密集方面通常比 CPU 更有效率」
PyTorch 使用 GPU,使其成為完成這項工作的完美工具。
重構
PyTorch 將用於我們目的的計算,因此重構現有的calculate_lottery_chances() 程式碼意味著更改依賴CPU 的數值運算並切換到適當的PyTorch 資料結構。簡而言之:
- Python set() 資料型別將不再足夠。
- Python randint() 函數將替換為其 PyTorch 等效函數。
- 由於 set() 資料類型不夠,因此會切換為產生與 lottery_players_count 大小相符的零張量,並用布林值來指示某個號碼之前是否中獎。
calculate_lottery_chances 的重構如下:
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>我將裝置設定為“xpu”,因為我的電腦使用 PyTorch 支援的 Intel Graphics GPU。 </p> <h2> 輸出 </h2> <p>為了確保在執行過程中使用我的 GPU,我在運行之前打開了 Windows 工作管理員並導航到「效能」部分。運行時,我發現 GPU 資源使用量有明顯峰值。 <br> 對於上下文,這是之前和之後的對比:</p> <p>之前:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637915280.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> 請注意 GPU 使用率為 1%</p> <p>之後:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638051975.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> 請注意,GPU 使用率為 49%</p> <p>對於不同 n 值的運行時間,GPU 的速度要快幾倍。它在不到一分鐘的時間內始終運行低於 100 的 n 值,並且能夠計算 <strong>5000</strong>(五千!)</p> 的 n 值 <p>這是使用 GPU 的執行時間表:</p> <div><table> <thead> <tr> <th>n</th> <th>Time (min and sec)</th> </tr> </thead> <tbody> <tr> <td>10</td> <td>0m13.920s</td> </tr> <tr> <td>20</td> <td>0m18.797s</td> </tr> <tr> <td>30</td> <td>0m24.749s</td> </tr> <tr> <td>50</td> <td>0m34.076s</td> </tr> <tr> <td>100</td> <td>1m12.726s</td> </tr> <tr> <td>1000</td> <td>16m9.831s</td> </tr> </tbody> </table></div> <p>為了直觀地了解本實驗中 GPU 和 CPU 操作之間的效能差距有多大,可以考慮以下資料視覺化:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638195144.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <p>x 軸的上限為 100,因為我無法再從 CPU 獲得實際的「及時」輸出,因此沒有空間與 GPU 進行比較。使用 1000 - 5000 範圍內的數字進行實驗,結果往往是「1440 萬次」。這就是我之前得到答案的方式。 </p> <h2> 注意事項 </h2> <p>這個實驗做出了假設並依賴某些做事方式。此外,我對 PyTorch 的經驗不足可能意味著可能有更有效的方法。以下是一些需要考慮的因素<strong>可能</strong>影響了我的發現的準確性或執行時間:</p> <ol> <li>我做了一個微妙的假設,即電腦生成的隨機性模仿了現實生活(物理世界)中的隨機性。 </li> <li>雖然我切換了一些邏輯以使用 PyTorch,但其餘程式碼仍然依賴 CPU。例如,在 Average_over_n_times() 函數中,迴圈中的加法和求平均值可能都會受益於 PyTorch 的等效項。我懷疑性能會有所提升。 </li> <li>我不確定我使用的batch_size對準確性和效能的影響。 </li> <li>所有 CPU 和 GPU 測試都是在我的電腦接通電源的情況下完成的,以便讓機器發揮最佳狀態。使用電池供電的設備運行它們可能會獲得更長的運行時間。 </li> <li>PyTorch 的 CUDA 可能比「XPU」更有優勢,但我的電腦不支援前者。 </li> <li>測試期間我避免讓我的電腦「休眠」。如果您的電腦處於睡眠狀態,測試可能需要更長時間才能運作。 </li> </ol> <p>最後,我想指出,這是我第一次使用 PyTorch 做任何事,它的性能給我留下了深刻的印象。 </p> <h2> 結論 </h2> <p>當我陷入困境時,我沒想到會看到效能上的如此提升。我了解了張量背後的想法以及一些有關計算更複雜的任務背後的支援機制的知識。您可以隨意使用、複製或修改程式碼片段。 </p> <p>感謝您對我的包容,希望您閱讀愉快。 </p> <p>下次再見,</p> <p>乾杯。 ? </p>
以上是一次彩票探索如何讓我了解 PyTorch 的強大功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

記事本++7.3.1
好用且免費的程式碼編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。