=========================================
function y=dis_rand(x,p,n)
%dis_rand 产生离散分布随机数
% x:可能取值
% p:取值概率
% n:拟生成随机数的数目
cp=cumsum(p)
y=zeros(1,n)
for i=1:n
y(i)=x(sum(cp<=rand(1))+1)
end
算法说明:利用matlab中的rand函数获取区间[0,1]上均匀分布的随机数,根据希望的分布律把[0,1]区间分段,各段的长差宽腔度依次为随机数取各个虚衫可能值的概率。当那个均匀分布的随机数落在其中第i个小段上时,就把第i个可能取值输出。
=========================================
你的问题这样调用:
y=dis_rand([0 0.5 1],[1/3 1/3 1/3],100)
即按照你要巧悔的概率从0,0.5,1三个数字中产生100个随机数。但我看了下因为rand本身在样本数少的时候就不是很准确,这样100个样本下,1/3概率还是有明显偏差的。不过所有概率方面的东西要在小样本下都很难”准确“了。
调试程序时世团,随机数种子可以设常数,例如srand(54321)用帆返绝 rand() 产生均匀分布随机数 x1,x2
利用瑞利分布得正态分布随机数 y1,y2
再按要求线态姿性缩放一下到[0.01,2] 区间。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
main(){
#define N 100
double rd[N]
double x1,x2,y1,y2
double pi2=6.28318530728,mx,mi,ave=0
int i
//srand(54321)
srand(time(NULL))
for (i=0i<=N-2i=i+2){
x1=1.0*rand()/RAND_MAX
x2=1.0*rand()/RAND_MAX
y1= sqrt((-2.0*log(x1))) * cos(pi2*x2)
y2= sqrt((-2.0*log(x1))) * sin(pi2*x2)
rd[i]=y1
rd[i+1]=y2
}
mx=rd[0]mi=rd[0]
for (i=0i<Ni++){
if (rd[i]>mx)mx=rd[i]
if (rd[i]<mi)mi=rd[i]
}
//printf("mi=%lf mx=%lf\n",mi,mx)
for (i=0i<Ni++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01
for (i=0i<N-2i=i+2) printf("%lf %lf\n",rd[i],rd[i+1])
return 0
}
不用加分,我做过,用来产生图像的高斯噪声,也就是你要的正态分布.1.首先你的样本应该是有一咐迟定范围的吧,我假设它是从1-255
2.根据你的方差和期望,把样本代进去,算出该样本出现的概率
3.然后根据概率知识,你做一个累积概率
4.接着你用随机数产生一个0-1之间的均匀分布
5.看这个衡竖李数落在哪个累积概纤册率区间
6.按你要的样本数重复4-5
代码这里我给个matlab程序你参考一下,很好懂的
function [dest] = GeneGauss(expectation,deviation,width,height)
dest=zeros(width,height)
pz=zeros(256)
tempConst1=1/(sqrt(2*pi)*deviation)
tempConst2=2*deviation*deviation
for i=1:256
pz(i)=tempConst1*exp(-(i-1-expectation)^2/tempConst2)
end
f=zeros(256)
f(1)=pz(1)
for i=2:256
f(i) = f(i-1)+pz(i)
end
for i=1:width
for j=1:height
n=rand
for k=1:256
if(n<f(k))
dest(i,j)=k-1
break
end
end
end
end
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)