对于随机数平时咱们仍是比较经常使用的,通常都会直接经过各类语言原生自带的随机函数,好比 c++ 中有random()
函数,java 中有 Random 类,python 有 random 模块等等。都能很方便生成随机变量,但它们有一个特色,那就是都服从均匀分布,而有些场景须要要生成不一样分布的随机变量。java
随机变量即随机函数,经过该函数能生成每一个可能事件对应的一个值。好比咱们掷骰子,每次按必定的几率生成一个值。有两种类型变量,python
主要用来表示不一样点对应的几率大小,即X轴上每一个单位长度对应的几率大小。几率等于面积,当某区间长度趋于0时则变为一个点,此时几率大小为f(x)。c++
两种算法都比较容易理解,第一个须要求逆函数,有时并很差求,而第二个基本没什么限制,对于任何分布都能很完成任务。下面就用第二种方法实现生成几种分布的随机数。git
正态分布github
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
复制代码
泊松分布bash
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
复制代码
https://github.com/sea-boat/MachineLearning_Lab/blob/master/distribution_gen.py并发
-------------推荐阅读------------dom
跟我交流,向我提问:
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
欢迎关注: