如何生成指定分布的随机数
前言
对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 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 ...
最新文章
- iqoo升级鸿蒙,vivo iQOO 3升级更新PD1955_A_1.12.27固件rom全量刷机包
- asp.net 在 Ngnix 服务器 中配置攻略
- 看张悟本神医现象有感
- 如何从另一个线程更新GUI?
- 倒计时2天!AI大咖云集、30场技术公开课,还有乐队... 年度最有意思的AI开发者活动来了!...
- Windows Azure Tools DSInit Error
- 科大星云诗社动态20220101
- 不要在viewWillDisappear:方法中移除通知
- 模糊图像处理 去除模糊_图像模糊如何工作
- 模拟器不全屏_puNES 适用于 Windows 和 Linux 的开源 NES 模拟器
- struts2的国际化(即实现网站整体中英文切换)实例
- Idea搭建SpringCloud(三)------Ribbon实现负载均衡及其自定义算法策略
- Curl 下载安装和配置
- 做数据分析,一定会用到的12类实用图表
- FairGuard游戏加固兼容摸摸鱼和TAPTAP云玩
- 友盟单点推送(推送给单个设备)
- 如何通过fiddler来进行接口数据mock测试
- 小羊的暑假博客计划教程索引
- Python 3.6实现单博主微博文本、图片及热评爬取
- 诺基亚S40V5平台实现后台运行图文教程