想要实现一个功能:不同事件发生的基础概率不同,根据基础概率来随机生成选项。
比如,北京的秋天有四种状态,并分别对应一个基础概率,然后随机生成某一天的天气情况。
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次天气情况,将各种天气情况的频率与初始设置的基础概率比较,发现结果很吻合。
巨人的肩膀: