生成随机数给定分布直方图

138(30天)
MATLAB提供了内置函数来生成随机数均匀或高斯分布(正常)。我的问题是:如果我有一个离散分布直方图,我怎么可以生成随机数,这种分布(如果人口(我生成数字)足够大)?
请在这里如果有人知道这样做的一个好方法。
谢谢你,大卫

接受的答案

乔纳森Epperl
乔纳森Epperl 2012年10月27日
因为没有任何建议,这是一个。如果你有一个离散分布,说这是一个Nx2矩阵 PD 第一列的离散值,第二的概率,所以相应的价值 总和(PD (:, 2)) = = 1
然后地图单位间隔的概率相加和使用 兰德 。什么意思:
%你的价值观和corr.概率:
PD = [
1.0000 - 0.1000
2.0000 - 0.3000
3.0000 - 0.4000
4.0000 - 0.2000);
%然后使它成为一个累积分布
D = cumsum (PD (:, 2));
% D = (0.1000 - 0.4000 0.8000 - 1.0000) '
现在每 r 生成的 兰德 ,如果它是之间 D(我) D (i + 1) ,那么对应于一个结果 PD (1, + 1) ,明显延长 我= = 0 。这里有一个方法可以做到这一点,虽然我相信有更好的公司:
R =兰德(100 1);%你的试验
p = @ (r)找到(r < pd, 1“第一”);%找到第一指数s.t。r < D(我);
%这是你随机试验的结果
rR = arrayfun (p, R);
%检查分布看起来是否正确:
嘘(rR, 1:4)
%,10%左右是1,30%是2等等
如果你想要更多的帮助你应该发布一个最小的例子的形式离散分布。
5个评论
Himanshu Tanwar
Himanshu Tanwar 2022年5月25日
整体代码可以写(通过一些轻微的修改):
dx = 0.001;
x = -100: dx: 100;%的限制取决于随机变量的定义。
例如,% (dx: dx: 100)瑞利(0不推荐)。
f = PDF (x);
F = cumsum (F) * dx;% CDF实验组的
F = F / F(结束);%推荐当马克斯(F)是接近1。否则增加x -点达到F(结束)- max值接近1。
N = 10000;
U =兰德(1,N);
pdf2rand = @ (u) x(找到(u < = F 1“第一”));
X = arrayfun (pdf2rand U);
X%的随机变量点
函数f = PDF (x)
%概率分布函数
结束

登录置评。

更多的答案(2)

图像分析
图像分析 2012年10月28日
我没有注意到你的问题或回答,特别是因为它是经常问。尝试RANDRAW ( //www.tianjin-qmedu.com/matlabcentral/fileexchange/7309-randraw )常见分布的列表。或者刷新自己的理论为什么使用CDF实验组的作品,看到维基百科: http://en.wikipedia.org/wiki/Inverse_transform_sampling

塞隆法雷尔
塞隆法雷尔 2019年4月30日
编辑:塞隆法雷尔 2019年4月30日
你好,
我使用这个天真的函数来生成人工离群值应用于机器学习。希望它能有点帮助。
函数[Out_Data, Out_PDF CHist] = Complement_PDF(嘘,Data_Num p)
%与一个PDF生成一个一维向量的数据指定为输入眩光的互补的PDF。注意,大
% Data_Num, Out_PDF CHist相似
%的输入
%嘘:PDF /数据的柱状图
% Data_Num:生成所需数量的数据
% p:精度由0后的数字
%输出
% Out_Data:按补充PDF生成的数据
按Out_Data % Out_PDF:互补的PDF
按嘘% CHist:互补的PDF
%的例子
%嘘= [1、6、7,100,0,0,0,2,3,5];
% Data_Number = 100000;
% p = 3
嘘=嘘/笔(嘘);
CHist = 1 -嘘;
CHist = CHist /笔(CHist);
CDF_CHist = cumsum (CHist);
CDF_CHist =双(int32 (CDF_CHist * 10 ^ p)) / 10 ^ p;
Data_Num Out_Data = 0 (1);
Out_PDF = 0(1、长度(CDF_CHist));
我= 1:Data_Num
%产生均匀分布的变量
双(x = int32(兰德* 10 ^ p)) / 10 ^ p;
%反向索引提供
Out_Data (i) = Inverse_CDF (x, CDF_CHist);
temp =地板(Out_Data(我)*长度(CDF_CHist));
Out_PDF(临时)= Out_PDF(临时)+ 1;
结束
图;
次要情节221年、酒吧(嘘);
次要情节222年、酒吧(CHist);
次要情节223年、情节(CDF_CHist);
次要情节224年、酒吧(Out_PDF);
结束
函数[y] = Inverse_CDF (x, CDF_CHist)
CDF_CHist_Ext = [0, CDF_CHist];
y = 1;
印第安纳州= 1:长度(CDF_CHist)
如果(x > = CDF_CHist_Ext(印第安纳州))& & (x < CDF_CHist_Ext(印第安纳州+ 1))
y =印第安纳州/长度(CDF_CHist);
打破;
结束
结束
结束

类别

找到更多的在随机数生成帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!