详解用python生成随机数的几种方法


Posted in Python onAugust 04, 2019

今天学习了用python生成仿真数据的一些基本方法和技巧,写成博客和大家分享一下。    

本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中生成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的某一区间内生成随机数,按照内容将博客分为3部分,并附上代码。

1 从给定参数的正态分布中生成随机数

当考虑从正态分布中生成随机数时,应当首先知道正态分布的均值和方差(标准差),有了这些,就可以调用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 从给定参数的均匀分布中获取随机数的函数

考虑从均匀分布中获取随机数的时候,要事先知道均匀分布的下界和上界,然后调用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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python list转矩阵的实例讲解
Aug 04 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
Python中shapefile转换geojson的示例
Jan 03 Python
使用Python批量修改文件名的代码实例
Jan 24 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 #Python
python中pygame安装过程(超级详细)
Aug 04 #Python
浅谈python图片处理Image和skimage的区别
Aug 04 #Python
Python下opencv图像阈值处理的使用笔记
Aug 04 #Python
python opencv 简单阈值算法的实现
Aug 04 #Python
Python pandas用法最全整理
Aug 04 #Python
python匿名函数用法实例分析
Aug 03 #Python
You might like
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php动态生成JavaScript代码
2009/03/09 PHP
PHP数据过滤的方法
2013/10/30 PHP
php获取操作系统语言代码
2013/11/04 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
js获取指定日期前后的日期代码
2013/08/20 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
vue this.reload 方法 配置
2018/09/12 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
如何利用cmp命令比较文件
2016/04/11 面试题
一些关于MySql加速和优化的面试题
2014/01/30 面试题
幼儿园教师自我鉴定
2014/03/20 职场文书
回复函范文
2015/07/14 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python