Python生成随机数实战:正态分布、均匀分布及概率抽样详解
本文详细讲解Python中生成随机数的多种方法,涵盖从指定参数的正态分布和均匀分布中采样,以及基于给定概率列表从离散数字或连续区间内抽取随机数的实现。通过Numpy和Random模块的代码示例,演示如何构建自定义函数以满足不同仿真数据生成需求。
Python随机数生成概述
本文分享利用Python生成仿真数据的基础方法与实用技巧。
内容主要涵盖如何根据给定参数从正态分布或均匀分布中生成随机数,以及如何依据指定概率从数字列表或区间列表中抽取特定数值。文章将内容划分为三个部分,并附带相关代码示例。
正态分布随机数生成
1 从给定参数的正态分布中生成随机数
若需从正态分布生成随机数,首先需明确分布的均值(loc)和标准差(scale)。掌握这两个参数后,即可调用Python内置模块生成随机数。此处使用Numpy模块中的random.normal函数,因逻辑相对简单,直接提供代码如下:
import numpy as np
# 定义从正态分布中获取随机数的函数
def get_normal_random_number(loc, scale):
"""
:param loc: 正态分布的均值
:param scale: 正态分布的标准差
:return:从正态分布中产生的随机数
"""
# 正态分布中的随机数生成
number = np.random.normal(loc=loc, scale=scale)
# 返回值
return number
# 主模块
if __name__ == "__main__":
# 函数调用
n = get_normal_random_number(loc=2, scale=2)
# 打印结果
print(n)
# 结果:3.275192443463058
均匀分布随机数生成
2 从给定参数的均匀分布中获取随机数的函数
在均匀分布中生成随机数时,需预先确定分布的下界(low)和上界(high)。随后调用Numpy模块的random.uniform函数即可生成相应的随机数。
import numpy as np
# 定义从均匀分布中获取随机数的函数
def get_uniform_random_number(low, high):
"""
:param low: 均匀分布的下界
:param high: 均匀分布的上界
:return: 从均匀分布中产生的随机数
"""
# 均匀分布的随机数生成
number = np.random.uniform(low, high)
# 返回值
return number
# 主模块
if __name__ == "__main__":
# 函数调用
n = get_uniform_random_number(low=2, high=4)
# 打印结果
print(n)
# 结果:2.4462417140153114
基于指定概率的随机数生成
3 按照指定概率生成随机数
在实际应用中,有时需要依据指定概率生成随机数。例如,已知盒子中不同颜色球的比例,预测下一次抽取球的颜色。本文讨论的问题与此类似,即给定一个概率列表,从对应的数字列表或区间列表中生成随机数,并分两部分进行探讨。
从数字列表中按概率抽取
3.1 按照指定概率从数字列表中随机抽取数字
假设给定一个数字列表及对应的概率列表,列表中对应位置的元素组成的元组表示该数字出现的概率。如何根据这些条件从数字列表中按概率抽取随机数?此处考虑使用均匀分布来模拟概率过程,代码如下:
import numpy as np
import random
# 定义从均匀分布中获取随机数的函数
def get_uniform_random_number(low, high):
"""
:param low: 均匀分布的下界
:param high: 均匀分布的上界
:return: 从均匀分布中产生的随机数
"""
# 均匀分布的随机数生成
number = np.random.uniform(low, high)
# 返回值
return number
# 定义从一个数字列表中以一定的概率取出对应区间中数字的函数
def get_number_by_pro(number_list, pro_list):
"""
:param number_list:数字列表
:param pro_list:数字对应的概率列表
:return:按概率从数字列表中抽取的数字
"""
# 用均匀分布中的样本值来模拟概率
x = random.uniform(0, 1)
# 累积概率
cum_pro = 0.0
# 将可迭代对象打包成元组列表
for number, number_pro in zip(number_list, pro_list):
cum_pro += number_pro
if x < cum_pro:
# 返回值
return number
# 主模块
if __name__ == "__main__":
# 数字列表
num_list = [1, 2, 3, 4, 5]
# 对应的概率列表
pr_list = [0.1, 0.3, 0.1, 0.4, 0.1]
# 函数调用
n = get_number_by_pro(number_list=num_list, pro_list=pr_list)
# 打印结果
print(n)
# 结果:1
从区间列表中按概率生成
3.2 按照指定概率从区间列表中的某个区间内生成随机数
给定一个区间列表及对应的概率列表,对应位置的元素组成的元组表示某数字出现在特定区间内的概率。基于已知条件,如何生成随机数?此处通过两次使用均匀分布来实现目标,代码如下:
import numpy as np
import random
# 定义从均匀分布中获取随机数的函数
def get_uniform_random_number(low, high):
"""
:param low: 均匀分布的下界
:param high: 均匀分布的上界
:return: 从均匀分布中产生的随机数
"""
# 均匀分布的随机数生成
number = np.random.uniform(low, high)
# 返回值
return number
# 定义从一个数字列表中以一定的概率取出对应区间中数字的函数
def get_number_by_pro(number_list, pro_list):
"""
:param number_list:数字列表
:param pro_list:数字对应的概率列表
:return:按概率从数字列表中抽取的数字
"""
# 用均匀分布中的样本值来模拟概率
x = random.uniform(0, 1)
# 累积概率
cum_pro = 0.0
# 将可迭代对象打包成元组列表
for number, number_pro in zip(number_list, pro_list):
cum_pro += number_pro
if x < cum_pro:
# 从区间[number. number - 1]上随机抽取一个值
num = get_uniform_random_number(number, number - 1)
# 返回值
return num
# 主模块
if __name__ == "__main__":
# 数字列表
num_list = [1, 2, 3, 4, 5]
# 对应的概率列表
pr_list = [0.1, 0.3, 0.1, 0.4, 0.1]
# 函数调用
n = get_number_by_pro(number_list=num_list, pro_list=pr_list)
# 打印结果
print(n)
# 结果:3.49683787011193
以上为本文的全部内容,希望能为各位的学习提供帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









