<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 9.1.2 隨機問題的建模與模擬 現實中有許多不確定的事件,稱為隨機事件。例如拋一枚硬幣,結果是正面朝上還是反 面朝上,這是不確定的。研究隨機事件的數學方法是統計,例如經過大量統計試驗可以得出 結論:拋硬幣時正面朝上和反面朝上的可能性是相等的,各占 50%。注意,說硬幣正面朝 上和反面朝上的可能性各占 50%,并不意味著拋硬幣試驗將得到“正,反,正,反,…” 的結果,完全有可能出現一連串的正面或一連串的反面。 既然現實問題中存在隨機事件,用計算機解決這類問題時就需要為隨機事件建模,即程 序能夠模擬隨機事件的發生。例如,假設程序 P 能夠模擬拋硬幣并顯示每次拋硬幣的結果(“正”或“反”),則 P 應該具有這樣的特性:每一次顯示的結果是不可預測的,但多次運 行 P 之后“正”、“反”出現的次數應該是差不多的。可以設想 P 中有這樣的語句: ``` if 模擬拋硬幣的結果是正面: print "正" else: print "反" ``` 這里 if 后面的條件必須有時為真有時為假,但無法預測每一次運行時的真假;而多次運行 后,條件為真為假的次數應該基本相等。 我們知道,計算機是確定性的機器,它總是按照預定的指令行事。對于一個程序,只要 程序的初始輸入是一樣的,那么程序的運行結果就是確定的、可預測的。就拿程序 9.1 來說,盡管它產生了看上去不可預測的數值序列,但那并非真正的隨機,因為按照程序 9.1 中的數 學式去計算,從相同的 x 開始必能得到完全一樣的數值序列。所以,程序 9.1 所用的數學式 不能用于模擬隨機事件,我們需要更好的能產生隨機數的方法。 隨機數生成函數 計算機科學家對隨機數生成問題有很成熟的研究,他們設計了一些數學公式,通過計算 這些公式就能得到隨機數。不過,既然是用確定的數學公式計算出來的數值,那就不可能是 數學意義上的隨機,因此準確的名稱實際上是“偽隨機數”。偽隨機數在實際應用中完全可 以當作真隨機數來使用,因為它具有真隨機數的統計分布特性,簡單地說就是“看上去”是 隨機的。 Python 語言提供了一個標準庫模塊 random,該模塊中定義了若干種偽隨機數生成函數。 這些偽隨機數生成函數的計算與模塊導入的時間(精度非常高)有關,因此每次運行函數所 產生的數值是不可預測的。random 模塊中用得最多的隨機數生成函數是 randrange 和 random。 randrange 函數生成一個給定范圍內的整型偽隨機數,范圍由 randrange 的參數指定,具 體格式和 range 函數一樣。例如,randrange(1,3)隨機地產生 1 或 2,randrange(1,7)返回范圍 [1,2,3,4,5,6]中的某個數值,而 randrange(2,100,2)返回小于 100 的某個偶數。例如: ``` >>> from random import randrange >>> for i in range(20): print randrange(1,3), 1 2 2 2 1 1 2 2 2 1 1 2 1 2 2 1 1 1 1 1 >>> for i in range(20): print randrange(1,7), 1 5 1 5 2 3 2 2 3 2 4 2 6 3 1 2 1 1 1 5 ``` 注意,由于試驗次數較少(20 次),randrange 所生成的數值并未如我們期望的那樣均勻分布, 但隨著試驗次數的增加,會發現 randrange 產生的值都具有差不多的出現次數。 random 函數可用來生成浮點型偽隨機數,確切地說,該函數生成[0,1)區間中的浮點數。 random 不需要提供參數。例如: ``` >>> from random import random >>> for i in range(5): print random() 0.35382204835 0.997559174002 0.672268961152 0.889307826404 0.246100521527 ``` 注意,random 模塊名與 random 函數名恰巧相同,不要因此而誤用。 模擬 有了隨機數生成函數,我們就可以來模擬隨機事件了。以拋硬幣問題為例,前面我們給 出了如下形式的代碼: ``` if 模擬拋硬幣的結果是正面: print "正" else: print "反" ``` 并且指出 if 后面的條件的真假應該是不可預測、均勻分布的。 考慮 randrange(1,3):該函數產生隨機數 1 或 2,每一次調用到底生成什么值是不可預測 的,并且大量調用后兩個數值出現的機會是一樣的。據此,randrange(1,3) == 1 正是我們所 需要的條件,此條件每一次計算時的真假是隨機的,但長遠來看真假情形各占 50%。將這 個條件代入上面的條件語句,即得 ``` if randrange(1,3) == 1: print "正" else: print "反" ``` 這樣,我們就通過調用合適的隨機數生成函數的方式模擬了隨機事件,這種模擬方法稱為蒙特卡洛方法。 類似地,擲骰子也是現實中常見的隨機問題,如果希望在程序中模擬擲骰子,可以這樣做: ``` value = randrange(1,7) print "你擲出的點數是:",value ``` 再看個例子,兩個運動員打乒乓球,誰能贏呢?勝負自然取決于球員的技術水平,但又 并非水平高的人必然贏,畢竟體育比賽和天時地利人和等各種因素有關。既然比賽結果有隨 機性,我們就可以利用蒙特卡洛方法來模擬比賽。假設 A、B 兩個球員相互之間的勝率大致 是 55%對 45%,那么他們打一次比賽(比賽的單位可以是 1 分、1 局或 1 盤,在此并不重要) 的結果可以用如下代碼模擬: ``` if random() &lt; 0.55: print "A wins." else: print "B wins." ``` 這里,由于 random()生成的隨機數均勻地分布在[0,1)區間內,所以有 55%的值落在 0.55 的 左邊,即 random() &lt; 0.55 為真的可能性為 55%,為假(即 random() &gt;= 0.55)的可能性為 45%, 這就恰當地模擬了 A 和 B 的勝率。注意,random() = 0.55 時應該算作 B 贏,因為 random() 生成的隨機數包含 0 但不包含 1。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看