详解用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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
关于python的list相关知识(推荐)
Aug 30 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python字符串Intern机制详解
Jul 01 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
Dec 11 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
python pygame入门教程
Jun 01 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
php 短链接算法收集与分析
2011/12/30 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php和html的区别点详细总结
2019/09/24 PHP
突发奇想的一个jquery插件
2010/11/19 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
vue2里面ref的具体使用方法
2017/10/27 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
Python使用剪切板的方法
2017/06/06 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python的等深分箱实例
2019/11/22 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
日本小田急百货官网:Odakyu
2018/07/19 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
英文版网络工程师求职信
2013/10/28 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
聘用意向书范本
2014/04/01 职场文书
文秘自荐信
2014/06/28 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
JavaCV实现照片马赛克效果
2022/01/22 Java/Android