详解⽤python⽣成随机数的⼏种⽅法
今天学习了⽤python⽣成仿真数据的⼀些基本⽅法和技巧,写成博客和⼤家分享⼀下。
本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中⽣成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的某⼀区间内⽣成随机数,按照内容将博客分为3部分,并附上代码。
1 从给定参数的正态分布中⽣成随机数
当考虑从正态分布中⽣成随机数时,应当⾸先知道正态分布的均值和⽅差(标准差),有了这些,就可以调⽤python中现有的模块和函数来⽣成随机数了。这⾥调⽤了Numpy模块中的al函数,由于逻辑⾮参简单,所有直接贴上代码如下:
import numpy as np
# 定义从正态分布中获取随机数的函数
def get_normal_random_number(loc, scale):
"""
:
param loc: 正态分布的均值
:param scale: 正态分布的标准差
:return:从正态分布中产⽣的随机数
"""
# 正态分布中的随机数⽣成
number = al(loc=loc, scale=scale)
# 返回值
return number
# 主模块
if __name__ == "__main__":
# 函数调⽤
n = get_normal_random_number(loc=2, scale=2)
# 打印结果
print(n)
# 结果:3.275192443463058
2 从给定参数的均匀分布中获取随机数的函数
考虑从均匀分布中获取随机数的时候,要事先知道均匀分布的下界和上界,然后调⽤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:按概率从数字列表中抽取的数字
"""
python生成1到100之间随机数
# ⽤均匀分布中的样本值来模拟概率
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
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。