详解用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中的map、reduce和filter浅析
Apr 26 Python
python网络编程学习笔记(10):webpy框架
Jun 09 Python
python脚本内运行linux命令的方法
Jul 02 Python
Python操作csv文件实例详解
Jul 31 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Python字典遍历操作实例小结
Mar 05 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
python如何保证输入键入数字的方法
Aug 23 Python
python调用接口的4种方式代码实例
Nov 19 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
Python基于network模块制作电影人物关系图
Jun 19 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
Protoss兵种对照表
2020/03/14 星际争霸
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
Python实现二叉搜索树
2016/02/03 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
python实现SMTP邮件发送功能
2020/06/16 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
django celery redis使用具体实践
2019/04/08 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
幼儿园毕业教师感言
2014/02/21 职场文书
公司接待方案
2014/03/08 职场文书
施工安全承诺书
2014/05/22 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android