详解用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 获取 Linux 系统信息的代码
Jul 13 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
python中尾递归用法实例详解
Apr 28 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
Python分析学校四六级过关情况
Nov 22 Python
Python实现网站表单提交和模板
Jan 15 Python
Python处理session的方法整理
Aug 29 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
快速查找Python安装路径方法
Feb 06 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
pytest进阶教程之fixture函数详解
Mar 29 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
支持oicq头像的留言簿(二)
2006/10/09 PHP
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
JS 继承实例分析
2008/11/04 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python requests使用socks5的例子
2019/07/25 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
环境保护与污染治理求职信
2014/07/16 职场文书
营销总监岗位职责
2014/09/16 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
邀请函的格式
2015/01/30 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
JavaScript 数组去重详解
2021/09/15 Javascript