离散ziggurat算法python实现_SLAM的数学基础(3):几种常见的概率分布的实现及验证。...

本文介绍了概率分布的基础概念,并详细探讨了二项分布、泊松分布、指数分布和正态分布的数学公式、计算方法及其在C++和Python中的实现。通过实例展示了如何使用这些分布进行概率计算,并验证了分布函数的正确性。同时,还探讨了如何生成符合这些分布的随机数。
摘要由CSDN通过智能技术生成

分布,在计算机学科里一般是指概率分布,是概率论的基本概念之一。分布反映的是随机或某个系统中的某个变量,它的取值的范围和规律。

常见的分布有:二项分布、泊松分布、正态分布、指数分布等,下面对它们进行一一介绍。

PS:本文中谈到的PDF、PMF、CDF均为公认的缩写方式:

PDF:概率密度函数(probability density function);

PMF:概率质量函数(probability mass function);

CDF:累积分布函数(cumulative distribution function)。

二项分布

说起二项分布,离不开伯努利实验,二项分布就是重复N次的伯努利实验(伯努利实验,是指一种只有两种相反结果的随机试验,比如抛硬币,结果只有正面和反面;又比如投篮,只有投中和没有投中两种结果)。它的PMF可写作:

99595ad60ac22ba22253828d7186a8bc.png

其中k为在n次实验中命中的次数,成功的概率为p。

二项分布的CDF可以写作:

0b1d6ba8478cf1bfc1147473182a5f46.png

例子:抛10次硬币,有2次正面朝上的概率是多少?下面分别用C++实现和用numpy证明结果

C++实现:

#include #include#include

double calc_binomial(int n, int k, doublep)

{if(n < 0 || k < 0)return 0.0;

std::vector< std::vector< double > > binomials((n + 1), std::vector< double >(k + 1));

binomials[0][0] = 1.0;for(int i = 1; i < (n + 1); ++i)

binomials[i][0] = (1.0 - p) * binomials[i - 1][0];for(int j = 1; j < (k + 1); ++j)

binomials[0][j] = 0.0;for(int i = 1; i < (n + 1); ++i)for (int j = 1; j < (k + 1); ++j)

binomials[i][j]= (1.0 - p) * binomials[i - 1][j] + p * binomials[i - 1][j - 1];returnbinomials[n][k];

}intmain()

{

std::cout<< std::fixed << std::setprecision(8) << calc_binomial(10, 2, 0.50) <<:endl>

}

结果为:0.04394531

Python实现:

importnumpy as npfrom scipy importstatsimportmatplotlib.pyplot as pltdefcalc_binomial():

n= 10p= 0.5k= 2binomial=stats.binom.pmf(k,n,p)printbinomial

calc_binomial()

结果为:0.0439453125

反之,知道投10次硬币朝上的平均概率为0.3(即平均有3次朝上),试着从10000次实验中找出规律。

用C++实现:

#include #include#include#include#include#include

int gen_binomial_rand(int n, doublep)

{int k = 0;for(int i = 0; i < n; i++)

{double current_probability = ((double)rand() / (double)RAND_MAX);if(current_probability

{

k++;

}

}returnk;

}intmain()

{

srand((unsigned)time(NULL));int gn = 10;double gp = 0.3;int times = 10000;int sum_of_times = 0;

std::vector< int >result(gn);for(int t = 0; t < times; t++)

{int single_result =gen_binomial_rand(gn, gp);if(single_result

{

result[single_result]++;

}

}

std::cout<<:endl i="0;" gn>

{

sum_of_times+=result[i];

std::cout<< result[i] << ",";

}

std::cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值