想要實現一個功能:不同事件發生的基礎概率不同,根據基礎概率來隨機生成選項。
比如,北京的秋天有四種狀態,並分別對應一個基礎概率,然后隨機生成某一天的天氣情況。
weatherlist = ['Sunny', 'Cloudy', 'Windy', 'Rainy']
probaslist = [0.30, 0.35, 0.25, 0.1]
實現腳本如下:
import random
def generate_weather(weather_list, probabilities_list):
if not (0.99999 < sum(probabilities_list) < 1.00001):
raise ValueError("The probabilities are not normalized!")
if len(weather_list) != len(probabilities_list):
raise ValueError("The length of two input lists are not match!")
random_normalized_num = random.random() # random() -> x in the interval [0, 1).
accumulated_probability = 0.0
for item in zip(weather_list, probabilities_list):
accumulated_probability += item[1]
if random_normalized_num < accumulated_probability:
return item[0]
測試運行情況:
weatherlist = ['Sunny', 'Cloudy', 'Windy', 'Rainy']
probaslist = [0.30, 0.35, 0.25, 0.1]
output_dict = {}
for x in weatherlist:
output_dict.update({x: 0})
n = 10000
for i in range(n):
weather = generate_weather(weatherlist, probaslist)
output_dict[weather] += 1
percentage_dict = {key: output_dict[key]/n for key in output_dict}
print(output_dict)
print(percentage_dict)
得到的結果為:
{'Sunny': 3033, 'Cloudy': 3466, 'Windy': 2484, 'Rainy': 1017}
{'Sunny': 0.3033, 'Cloudy': 0.3466, 'Windy': 0.2484, 'Rainy': 0.1017}
模擬生成10000次天氣情況,將各種天氣情況的頻率與初始設置的基礎概率比較,發現結果很吻合。
巨人的肩膀:
