Educoder python NumPy基礎及取值操作 第4關:隨機數生成

 題目鏈接:https://www.educoder.net/tasks/57zmupfn38ek


任務描述

本關任務:根據本關所學知識,補全右側代碼編輯器中缺失的代碼,完成程序的編寫並通過所有測試用例。

相關知識

爲了完成本關任務,你需要掌握:

  • 簡單隨機數生成;

  • 概率分佈隨機數生成;

  • 隨機種子。

簡單隨機數生成

NumPyrandom模塊下提供了許多生成隨機數的函數,如果對於隨機數的概率分佈沒有什麼要求,則通常可以使用random_samplechoicerandint等函數來實現生成隨機數的功能。

random_sample

random_sample用於生成區間爲[0, 1]的隨機數,需要填寫的參數size表示生成的隨機數的形狀,比如size=[2, 3]那麼則會生成一個23列的ndarray,並用隨機值填充。示例代碼如下:


 
  1. import numpy as np
  2.  
  3. '''
  4. 結果可能爲[[0.32343809, 0.38736262, 0.42413616]
  5. [0.86190206, 0.27183736, 0.12824812]]
  6. '''
  7. print(np.random.random_sample(size=[2, 3]))

choice

如果想模擬像擲骰子、扔硬幣等這種隨機值是離散值,而且知道範圍的可以使用choice實現。choice的主要參數是asizea是個一維數組,代表你想從a中隨機挑選;size是隨機數生成後的形狀。假如模擬5次擲骰子,代碼如下:


 
  1. import numpy as np
  2.  
  3. '''
  4. 擲骰子時可能出現的點數爲1, 2, 3, 4, 5, 6,所以a=[1,2,3,4,5,6]
  5. 模擬5此擲骰子所以size=5
  6. 結果可能爲 [6, 4, 3, 1, 3]
  7. '''
  8. print(np.random.choice(a=[1, 2, 3, 4, 5, 6], size=5))

randint

randint的功能和choice差不多,只不過randint只能生成整數,而choice生成的數與a有關,如果a中有浮點數,那麼choice會有概率挑選到浮點數。

randint的參數有3個,分別爲lowhighsize。其中low表示隨機數生成時能夠生成的最小值,high表示隨機數生成時能夠生成的最大值減1。也就是說randint生成的隨機數的區間爲[low, high)。假如模擬5次擲骰子,代碼如下:


 
  1. import numpy as np
  2.  
  3. '''
  4. 擲骰子時可能出現的點數爲1, 2, 3, 4, 5, 6,所以low=1,high=7
  5. 模擬5此擲骰子所以size=5
  6. 結果可能爲 [6, 4, 3, 1, 3]
  7. '''
  8. print(np.random.randint(low=1, high=7, size=5)

概率分佈隨機數生成

如果對於產生的隨機數的概率分佈有特別要求,NumPy同樣提供了從指定的概率分佈中採樣得到的隨機值的接口。在這裏主要介紹高斯分佈。

高斯分佈又稱爲正態分佈,其分佈圖形如下:

上圖中橫軸爲隨機變量的值(在這裏可以看成是產生的隨機值),縱軸表示隨機變量對應的概率(在這裏可以看成是隨機值被挑選到的概率)。

其實在日常生活中有很多現象或多或少都符合高斯分佈。比如某個地方的高考分數,一般來說高考分數非常低和高考分數非常高的學生都比較少,而分數中規中矩的學生比較多,如果所統計的數據足夠大,那麼高考分數的概率分佈也會和上圖一樣,中間高,兩邊低

想要實現根據高斯分佈來產生隨機值,可以使用normal函數。示例代碼如下:


 
  1. import numpy as np
  2.  
  3. '''
  4. 根據高斯分佈生成5個隨機數
  5. 結果可能爲:[1.2315868, 0.45479902, 0.24923969, 0.42976352, -0.68786445]
  6.  
  7. 從結果可以看出0.4左右得值出現的次數比較高,1和-0.7左右的值出現的次數比較低。
  8. '''
  9. print(np.random.normal(size=5)

其中normal函數除了size參數外,還有兩個比較重要的參數就是locscale,它們分別代表高斯分佈的均值方差loc影響的分佈中概率最高的點的位置,假設loc=2,那麼分佈中概率最高的點的位置就是2。下圖體現了loc對分佈的影響,其中藍色f分佈的loc=0,紅色分佈的loc=5

scale影響的是分佈圖形的胖瘦,scale越小,分佈就越又高又瘦,scale越大,分佈就越又矮又胖。下圖體現了scale對分佈的影響,其中藍色分佈的scale=0.5,紅色分佈的scale=1.0

所以,想要根據均值爲1,方差爲10的高斯分佈來生成5個隨機值,代碼如下:


 
  1. import numpy as np
  2.  
  3. print(np.random.normal(loc=1, scale=10, size=5)

隨機種子

前面說了這麼多隨機數生成的方法,那麼隨機數是怎樣生成的呢?其實計算機產生的隨機數是由隨機種子根據一定的計算方法計算出來的數值。所以只要計算方法固定,隨機種子固定,那麼產生的隨機數就不會變!

如果想要讓每次生成的隨機數不變,那麼就需要設置隨機種子(隨機種子其實就是一個002^{32}-1232−1的整數)。設置隨機種子很長簡單,調用seed函數並設置隨機種子即可,代碼如下:


 
  1. import numpy as np
  2.  
  3. # 設置隨機種子爲233
  4. np.random.seed(seed=233)
  5.  
  6. data = [1, 2, 3, 4]
  7.  
  8. # 隨機從data中挑選數字,結果爲4
  9. print(np.random.choice(data))
  10.  
  11. # 隨機從data中挑選數字,結果爲4
  12. print(np.random.choice(data))

編程要求

根據提示,在右側編輯器Begin-End處補充代碼,將測試用例輸入打亂順序並返回打亂結果。

  • 具體要求請參見後續測試樣例。

注意:評測程序內部已經設置好了隨機種子,爲了順利評測,請使用np.random.choice()函數來實現打亂順序。

請先仔細閱讀右側上部代碼編輯區內給出的代碼框架,再開始你的編程工作!

測試說明

平臺會對你編寫的代碼進行測試,對比你輸出的數值與實際正確的數值,只有所有數據全部計算正確才能進入下一關。

測試輸入:

[1, 2, 3, 4, 5, 6]

預期輸出:

[6, 2, 5, 4, 3, 1]

開始你的任務吧,祝你成功!

import numpy as np
def shuffle(input_data):
    '''
    打亂input_data並返回打亂結果
    :param input_data: 測試用例輸入,類型爲list
    :return: result,類型爲list
    '''
    # 保存打亂的結果
    result = []
    #********* Begin *********#
    hash = set()
    while len(hash) < len(input_data):
        num = np.random.choice(input_data)
        if num not in hash:
            hash.add(num)
            result.append(num)
    #********* End *********#
    return result

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章