泊松随机数
最近需要在模型表面网格内采样获取模型表面点云,需要根据网格面积与模型面积计算网格内部的采样数,这里用到了泊松随机数计算网格内采样数。
任务简述
设泊松分布的强度
λ
{\lambda}
λ计算如下:
λ
=
A
M
e
s
h
A
M
o
d
e
l
∗
N
s
u
m
{\lambda}=\frac{A_{Mesh}}{A_{Model}}*N_{sum}
λ=AModelAMesh∗Nsum
其中
A
M
e
s
h
A_{Mesh}
AMesh为当前网格的面积;
A
M
o
d
e
l
A_{Model}
AModel为模型表面积;
N
s
u
m
N_{sum}
Nsum为预定采样数量。以
λ
{\lambda}
λ为基础,计算Knuth Poisson 随机数,计算过程如下:
algorithm poisson random number (Knuth):
init:
Let L ← e^−λ, k ← 0 and p ← 1.
do:
k ← k + 1.
Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.
其过程基本可以描述为:
1、在0-1区间上生成服从均匀分布的随机数;
2、从头至尾求随机数乘积,知道乘积小于或等于 e − λ e^{-{\lambda}} e−λ时,记录参与乘积的随机数数目;
3、返回随机数减一;
多次实验的时候,随机数分布是服从参数为 λ {\lambda} λ的泊松分布的。
具体推导过程请看:泊松随机数的生成算法:数学推导和程序实现)
Matlab 实验
%% PoissonRandomNumber_f.m
function [res]= PoissonRandomNumber_f(lambda)
% algorithm poisson random number (Knuth):
% init:
% Let L ← e^−λ, k ← 0 and p ← 1.
% do:
% k ← k + 1.
% Generate uniform random number u in [0,1] and let p ← p × u.
% while p > L.
% return k − 1.
L = exp(-lambda);
p = 1.0;
res=0;
while(1)
res = res+1;
p = p*rand(1,1);
if(p<=L)
break;
end
end
%% PoissonRandomNumber.m
clc
clear
lambda = floor(rand(1)*50);
size = 3000;
k=zeros(1,size);
for i=1:size
k(1,i) = PoissonRandomNumber_f(lambda);
end
figure(1);
x = 0:1:max(k);
y = poisspdf(x,lambda)*size;
[a,b]= max(y);
histogram(k);
hold on;
plot(x,y);
title('Possion Random Number');
xlabel('RandomNumber')
ylabel('Statistics')
text(x(b),max(y),['\lambda=',num2str(lambda)]);