如何生成指定分布的随机数
前言
对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 c++ 中有random()
函数,java 中有 Random 类,python 有 random 模块等等。都能很方便生成随机变量,但它们有一个特点,那就是都服从均匀分布,而有些场景需要要生成不同分布的随机变量。
随机变量
随机变量即随机函数,通过该函数能生成每个可能事件对应的一个值。比如我们掷骰子,每次按一定的概率生成一个值。有两种类型变量,
* 离散型随机变量,能取到的不相同的值是有限个或可列无限多个。
* 连续型随机变量,能取到的值可以是连续的,在某个区间内可取任意一实数。
概率密度函数
主要用来表示不同点对应的概率大小,即X轴上每个单位长度对应的概率大小。概率等于面积,当某区间长度趋于0时则变为一个点,此时概率大小为f(x)。
常见分布
- 伯努利分布,即0-1分布,随机变量为0或为1,概率为p和1-p。
- 二项分布,进行n次伯努利实验,相对于不同成功次数对应的概率。
- 泊松分布,是二项分布的极限形式。
- 均匀分布,在相同长度间隔的分布概率是等可能的。
- 正态分布,又名高斯分布,正态曲线呈钟型,两头低,中间高。
- 指数分布,描述事件以恒定平均速率连续且独立地发生的过程的概率分布。
- 逻辑斯蒂分布,增长分布,形状有点像正态分布。
生成分布算法
- Inverse Transform Method,首先生成一个均匀分布的随机数,再求指定分布的分布函数F(x),然后求得F(x)的逆函数G(x),将随机数带入逆函数得到的即为指定分布的随机数。
- Acceptance-Rejection Method,首先生成一个均匀分布随机数a,设概率密度函数为f(x),然后再生成一个均匀分布随机数b,若b<=f(a),则成功得到指定分布的随机数,否则从头开始。
实现
两种算法都比较容易理解,第一个需要求逆函数,有时并不好求,而第二个基本没什么限制,对于任何分布都能很完成任务。下面就用第二种方法实现生成几种分布的随机数。
正态分布
def normal_pdf(x, mu=0, sigma=1):return (1 / (math.sqrt(2 * math.pi) * sigma)) * (math.exp(-math.pow(x - mu, 2) / (2 * math.pow(sigma, 2))))def standard_normal_rand():while True:a = random.uniform(-4.0, 4.0)b = random.uniform(0.0, 3.0)if b < normal_pdf(a):return a, b
指数分布
def exponential_pdf(x, lam=1):return lam * math.exp(-lam * x)def exponential_rand():while True:a = random.uniform(0.0, 100.0)b = random.uniform(0.0, 3.0)if b <= exponential_pdf(a):return a, b
泊松分布
def poisson_pdf(x, lam=1):return (math.pow(lam, x) / math.factorial(x)) * math.exp(-lam)def poisson_rand():while True:a = random.randint(0, 50)b = random.uniform(0.0, 1.0)if b <= poisson_pdf(a):return a, b
github
https://github.com/sea-boat/MachineLearning_Lab/blob/master/distribution_gen.py
————-推荐阅读————
我的2017文章汇总——机器学习篇
我的2017文章汇总——Java及中间件
我的2017文章汇总——深度学习篇
我的2017文章汇总——JDK源码篇
我的2017文章汇总——自然语言处理篇
我的2017文章汇总——Java并发篇
跟我交流,向我提问:
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
为什么写《Tomcat内核设计剖析》
欢迎关注:
如何生成指定分布的随机数相关推荐
- 如何产生指定分布的随机数?
参考:https://www.cnblogs.com/xingshansi/p/6539319.html: https://www.jianshu.com/p/3d30070932a8: https: ...
- Excel 技巧篇-公式实现在指定范围内生成指定小数位的随机数
Excel 生成随机数的公式有两种: 第一个是,生成 0 到 1 之间的小数 =RAND() 第二个是,生成指定两个数之间的整数 =RANDBETWEEN(1,100) 如果我们想要在指定范围内生成指 ...
- mysql默认值是随机数_mysql生成指定位数的随机数及批量生成随机数的方法
1. 先介绍几个常用的 mysql 函数 rand() 随机生成 0~1 之间的小数(0<1) ceiling 向上取整 floor 向下取整 2. 生成随机数 -- 生成 3 ...
- python 生成指定概率的随机数
生成指定概率的随机数 需求 解决方法 需求 遇到一些情况需要指定概率的条件下生成随机数,比如要生成姓名字符串,随机生成的话一般是两个字的姓名和3个字的姓名概率是一样的,而实际应该是大部分偏向三个字的, ...
- R语言使用rnorm函数基于不同的均值、方差参数生成正太分布的随机数、使用plot函数和density函数可视化正太分布的随机数对应的密度图、自定义设置均值和方差
R语言使用rnorm函数基于不同的均值.方差参数生成正太分布的随机数.使用plot函数和density函数可视化正太分布的随机数对应的密度图.自定义设置均值和方差(Normal distributio ...
- java生成指定范围的随机数(太屌了)
生成指定范围内的随机数 这个是最常用的技术之一.程序员希望通过随机数的方式来处理众多的业务逻辑,测试过程中也希望通过随机数的方式生成包含大量数字的测试用例.问题往往类似于: 如何随机生成 1~100 ...
- 【C++操作手册】C++生成指定范围内随机数rand(随机数种子)
c++中的rand函数是用来生成随机数的,它的生成范围是0-Random_max,这个一个内部定义的一个常量,如果我们需要每次生成的随机数不同,这时需要加上随机数种子,利用srand()函数,我们可以 ...
- mysql生成固定位数随机数_mysql生成指定位数的随机数
1. 先介绍几个常用的 MySQL 函数 RAND() 随机生成 0~1 之间的小数(0<1) CEILING 向上取整 FLOOR 向下取整 2. 生成随机数 [code]- ...
- python生成指定位数随机数_python生成指定长度的随机数密码
复制代码 代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- #导入random和string模块 import random, string def ...
最新文章
- GIT入门笔记(4)- GIT 安装
- linux rm命令参数及用法详解---linux删除文件或目录命令
- php实现防止sql注入的通用方法,PHP实现防止sql注入的通用方法
- html5网页制作代码_HTML5的网页设计教程
- android q升级名单,华为升级 Android Q 机型名单敲定 阵容庞大
- 想做出让老板眼前一亮的可视化报告,这几个“心机”千万要有
- 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理
- 王健林最好的时代过去了
- 【Druid IO】Druid的imply方式安装
- [转]VSS中创建分支
- html真实雾效果图,HTML5 Canvas图片上云雾弥漫驱散特效
- T1155 金明的预算方案 codevs
- 华容道6×6图解_华容道(带图解)
- go sync.once用法
- cad图层置顶的lisp_cad中如何将一个图层置于上层
- 小程序标准版交易组件开启
- 教你一键开发桌面应用程序
- Oracle数据库违反唯一约束条件
- c语言编程水果忍者,少儿创意编程scratch初级游戏之一水果忍者
- 使用机器学习来预测股票价格
热门文章
- 豆豆趣事[2012年12月]
- 微博切换账号显示服务器异常请稍后再试,这个微博名,登陆时候提示服务器数据异常...
- android如何调取网站后台的图片,基于Bmob后台开发Android的APP项目——从后端获取图片,以及在后端上上传图片...
- Windows网络无连接自动重启bat脚本
- 7.10 10.1-10.5
- 我们父辈关于房子的事情(r11笔记第93天)
- 快播公司2.6亿元天价侵权罚款 侵了宅男们的心
- escapeHTML实现
- Mobox教育私有云盘助力 学校教学资源库平台建设
- HIT_Trainning20140501