如何生成指定分布的随机数

如何生成指定分布的随机数对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 c++ 中有random()函数,java 中有 Random 类,python 有 random 模块等等。都能很方便生成随机变量,但它们有一个特点,那就是都服从均匀分布,而有些场景需要要生成…

前言

对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 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://bianchenghao.cn/15247.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注