在 Python 中以不同機率從列表中選擇元素


建立精確模擬的一個重要方面是能夠以不同的機率從列表中選擇元素。例如,在人群模擬中,某些動作可能比其他動作更有可能發生,或者在物理系統模擬中,粒子可能以不同的機率向不同的方向移動。

Python 提供了幾種方法來以不同的機率從列表中選擇元素。在本教程中,我們將探討不同的技術來實現這一點,使用內建的 random 模組和 NumPy 模組。

以相等機率從列表中選擇元素

讓我們首先討論如何以相等機率從列表中選擇元素。random 模組提供了一個名為 choice() 的函式,該函式從列表中返回一個隨機元素。

示例

以下是一個示例:

import random
my_list = [1, 2, 3, 4, 5]
random_element = random.choice(my_list)
print(random_element) 

輸出

3

在此示例中,我們匯入 random 模組並定義一個名為 my_list 的列表。然後,我們使用 choice() 函式從 my_list 中選擇一個隨機元素並將其分配給變數 random_element。最後,我們列印 random_element 的值。

以不同機率從列表中選擇元素

現在讓我們討論如何以不同的機率從列表中選擇元素。假設我們有一個元素列表,我們希望以不同的機率選擇每個元素。我們可以使用 Python 中的 random.choices() 函式來實現。

random.choices() 函式接受三個引數:

  • 要從中選擇的元素列表

  • 每個元素的機率列表

  • 要選擇的元素數量(可選)

示例

以下是一個示例:

import random
my_list = [1, 2, 3, 4, 5]
my_probabilities = [0.1, 0.2, 0.3, 0.2, 0.2]
random_elements = random.choices(my_list, weights=my_probabilities, k=10)
print(random_elements) 

輸出

上述程式碼的輸出將是一個包含 10 個元素的列表,每個元素根據 my_probabilities 中指定的機率進行選擇。

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

在此示例中,我們定義了一個名為 my_list 的列表,其中包含我們要從中選擇的元素。我們還定義了一個名為 my_probabilities 的列表,其中包含每個元素的機率。所有機率的總和應等於 1。

然後,我們使用 random.choices() 函式根據 my_probabilities 中定義的機率從 my_list 中選擇 10 個隨機元素。weights 引數指定每個元素的機率分佈,k 引數指定要選擇的元素數量。

使用字典儲存機率

在前面的示例中,我們在單獨的列表中定義了每個元素的機率。但是,通常更方便地將機率儲存在字典中。

示例

以下是一個示例:

import random
my_dict = {'a': 0.1, 'b': 0.2, 'c': 0.3, 'd': 0.2, 'e': 0.2}
random_elements = random.choices(list(my_dict.keys()),
weights=list(my_dict.values()), k=10)
print(random_elements) 

輸出

['c', 'a', 'b', 'b', 'b', 'e', 'b', 'b', 'e', 'c'] 

在此示例中,我們定義了一個名為 my_dict 的字典,其中包含我們要從中選擇的元素作為鍵,以及它們各自的機率作為值。然後,我們使用 random.choices() 函式根據字典值中定義的機率從字典的鍵中選擇 10 個隨機元素。

請注意,我們使用 list() 函式將字典的鍵和值轉換為列表,因為 random.choices() 函式需要一個元素列表和一個權重列表。

使用 NumPy 模組生成隨機機率

在前面的示例中,我們手動定義了每個元素的機率。但是,在許多情況下,我們可能希望生成隨機機率。numpy 模組提供了各種用於生成隨機數和陣列的函式,包括用於生成隨機機率的函式。

示例

以下是一個示例:

import random
import numpy as np
my_list = [1, 2, 3, 4, 5]
my_probabilities = np.random.dirichlet(np.ones(len(my_list)), size=1)[0]
random_elements = random.choices(my_list, weights=my_probabilities, k=10)
print(random_elements) 

輸出

[1, 5, 1, 1, 1, 3, 3, 3, 5, 5] 

在此示例中,我們將 numpy 模組匯入為 np 並定義一個名為 my_list 的列表,其中包含我們要從中選擇的元素。然後,我們使用 numpy.random.dirichlet() 函式為 my_list 中的元素生成隨機機率分佈。

dirichlet() 函式接受兩個引數:濃度引數和輸出陣列的大小。在本例中,我們將濃度引數設定為與 my_list 長度相同的全為 1 的陣列,並將大小設定為 1 以獲得一個一維機率陣列。

然後,我們像以前一樣使用 random.choices() 函式根據 my_probabilities 中定義的機率從 my_list 中選擇 10 個隨機元素。

結論

在本教程中,我們討論瞭如何使用 random 模組在 Python 中以不同的機率從列表中選擇元素。我們還討論瞭如何使用 NumPy 模組生成隨機機率。透過理解這些技術,您可以在 Python 程式中模擬機率事件並分析結果。

更新時間: 2024 年 2 月 22 日

1K+ 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告