产生不等二维概率分布随机数,符合何种分布?

产生各种概率分布的随机数_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
产生各种概率分布的随机数
产​生​各​种​概​率​分​布​的​随​机​数
大小:846.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢随机数生成及各概率分布_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
随机数生成及各概率分布
随​机​数​生​成​与​各​概​率​分​步
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢Javascript 随机数函数 学习之二:产生服从正态分布随机数
您当前位置: &
[ 所属分类
一、为什么需要服从正态分布的随机函数一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等。假如我们在制作一个游戏,要随机设定许许多多 NPC 的身高,如果还用Math.random(),生成从140 到 220 之间的数字,就会发现每个身高段的人数是一样多的,这是比较无趣的,这样的世界也与我们习惯不同,现实应该是特别高和特别矮的都很少,处于中间的人数最多,这就要求随机函数符合正态分布。二、正态分布复习图片来自:http://zh.wikipedia.org/zh-cn/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83具体性质也请查阅上面链接,描述正态分布的主要特征是均值和方差,如上图,最左的倒钟形图的均值为-2, 其余为0 ;方差越大,钟形越扁平,方差越小越陡;密度函数图像关于均值对称。在x=μ±σ处,曲线有拐点。函数曲线下68.26%的面积在平均数左右的一个标准差σ的区间内。95.44%的面积在平均数左右两个标准差2σ的区间内。99.74%的面积在平均数左右三个标准差3σ的区间内。当均值为0, 方差为 1 时称为标准正态分布;三、由均匀分布经 “Box-Muller法” 转换为正态分布通过查阅文献可知(请参见:http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform),有一个称为 Box-Muller (1958) 转换的算法能够将两个在区间(0,1] 的均匀分布转化为标准正态分布,其公式为:y1 = sqrt( - 2 ln(u) ) cos( 2 pi v )y2 = sqrt( - 2 ln(u) ) sin( 2 pi v )因为三角函数计算较慢,我们可以通过上述公式的一个 polar form(极坐标形式)能够简化计算,算法描述如下:复制代码function getNumberInNormalDistribution(mean,std_dev){ return mean+(randomNormalDistribution()*std_dev);}function randomNormalDistribution(){ var u=0.0, v=0.0, w=0.0, c=0.0; do{ //获得两个(-1,1)的独立随机变量 u=Math.random()*2-1.0; v=Math.random()*2-1.0; w=u*u+v*v; }while(w==0.0||w&=1.0) //这里就是 Box-Muller转换 c=Math.sqrt((-2*Math.log(w))/w); //返回2个标准正态分布的随机数,封装进一个数组返回 //当然,因为这个函数运行较快,也可以扔掉一个 //return [u*c,v*c]; return u*c;}复制代码因此,假如我们要获得均值为180,要68.26%左右的NPC身高都在[170,190]之内,即1个标准差范围内,因此标准差为10, 可以通过getNumberInNormalDistribution(180,10) 调用,我们实验1000000词,得到结果如下:复制代码// 身高:频率128:1132:1133:1134:1135:1136:2137:4138:8139:11140:14141:19142:28143:41144:54145:80146:133147:153148:235149:333150:429151:598152:764153:1059154:1314155:1776156:2290157:2835158:3503159:4373160:5513161:6475162:7809163:9437164:11189165:13282166:15020167:17239168:19215169:21597170:24336171:26684172:29000173:31413174:33179175:35027176:37084177:38047178:38968179:39635180:39700181:39548182:38960183:38674184:36948185:35220186:33224187:31038188:29198189:26668190:23893191:21662192:19476193:16898194:15056195:13046196:10971197:9456198:7928199:6697200:5370201:4334202:3548203:2810204:2330205:1765206:1350207:1093208:797209:595210:371211:328212:255213:165214:121215:91216:71217:29218:32219:28220:20221:6222:7223:7224:3225:2228:1复制代码绘制成柱状图如下:可见,这是有着非常明显的正态分布图像特征。四、由均匀分布叠加获得正态分布我们需要祭出万能的中心极限定理。根据独立同分布的中心极限定理:设随机变量X1,X2,...Xn,...相互独立,服从同一分布,且数学期望为μ,标准差为σ (σ&0),则随机变量之和的标准化变量:Y=((X1+X2+...+Xn)-nμ)/(sqrt(n)*sqrt(σ)) 近似服从标准正态分布 N(0,1)如果我们将足够多个均匀分布随机变量相加,相加之和将服从正态分布。但是,我们需要累加多少个均匀分布才能较好低近似正态分布呢?由于 X~U(0, 1) , 可得 μ=1/2, σ=sqrt(1/12),代入上面的式子即可近似模拟随机变量之和的概率密度函数(p.d.f).下图是由2个服从 U(0,1) 分布的随机变量相加得到的 p.d.f 图像:如果我们增加累加的均匀分布的数量会怎样呢?上图是 n=3 时的图像,可以看到正态分布的形状出来了,但顶端还略为平缓。特别低,当n=12时 (随机变量(X1+X2+...+Xn)的均值为6,方差为1) 这时有一个很好的特点,公式 Y=((X1+X2+...+Xn)-nμ)/(sqrt(n)*sqrt(σ)) 的分母正好为1,因此简化成了 Y=((X1+X2+...+Xn)-nμ),非常便于编程计算,并且已经非常接近于标准正态分布,请见下图:也就是说均值为μ,标准差为σ 的独立同分布变量 X1,X2, ..., Xn 的算数平均数 T=(X1+X2+ ...+ Xn)/n,当n充分大时,近似地服从均值为μ,方差为σ*σ/n 的正态分布。最后,代码如下:复制代码function getNumberInNormalDistribution(mean,std_dev){
return mean+(uniform2NormalDistribution()*std_dev);}function uniform2NormalDistribution(){ var sum=0.0; for(var i=0; i&12; i++){ sum=sum+Math.random(); } return sum-6.0;}本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程
转载请注明本文标题:本站链接:
1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
同在一个环境中生活,强者与弱者的分界就在于谁能改变它
手机客户端5289人阅读
C语言中可以通过rand函数生成满足均匀分布的随机数,但是生成满足正太分布的随机数就没有那么简单了,下面对常用的几种方法进行总结并用C++编程实现。
方法一:由均匀分布的随机数来产生
&&&&一个简单可行的并且容易编程的方法是:求12个在(0,1)上均匀分布的和,然后减6(12的一半)。这种方法可以用在很多应用中,这12个数的和是Irwin-Hall分布;选择一个方差12。但此推导的结果限制在(-6,6)之间,并且密度为12。
方法二:Box-Muller方法
&&&&Box-Muller方法是以两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准常态分布随机变量X和Y:
方法三:由正弦曲线图形得到的直观结果
图1 正态分布曲线
从上图可以看出,在μ附近的概率密度大,远离μ的地方概率密度小,我们要产生的随&机数要服从这种分布,就是要使产生的随机数在μ附近的概率要大,远离μ处小。算法的主要思想是:在上图的大矩形中随机产生点,这些点是平均分布的,如果产生的点落在概率密度曲线的下方,则认为产生的点是符合要求的,将它们保留,如果在概率密度曲线的上方,&则认为这些点不合格,将它们去除。如果随机产生了一大批在整个矩形中均匀分布的点,那&么被保留下来的点的横坐标就服从了正态分布。可以设想,由于在μ处的&f(x)的值比较大,理所当然的在μ附近的点个数要多,远离μ处的少,这从面积上就可以看出来。我们要产生的随机数就是这里的横坐标。
根据以上所述三种方法,编写C++测试代码如下:
#include &math.h&
#include &stdlib.h&
#include &time.h&
#include &fstream&
#include &iostream&
#define pi 3.1415926
#define rd (rand()/(RAND_MAX+1.0))
//区间[min,max]上的均匀分布,min和max要求传入的参数类型一致
template &&span style=&color:blue&&class T&
T rand(T min, T max)
return min+(max-min)*rand()/(RAND_MAX+1.0);
//求均值为miu,方差为sigma的正太分布函数在x处的函数值
double normal(double x, double miu,double sigma)
return 1.0/sqrt(2*pi)/sigma*exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
//按照矩形区域在函数值曲线上下位置分布情况得到正太函数x值
double randn(double miu,double sigma, double min ,double max)
double x,y,dS
x=rand(min,max);
y=normal(x,miu,sigma);
dScope=rand(0.0,normal(miu,miu,sigma));
}while(dScope&y);
double randn(int type)
//按照12个均匀分布之和减去6得到正态分布函数的x值
if (type==1)
return rd+rd+rd+rd+rd+rd+rd+rd+rd+rd+rd+rd-6.0;
//按照计算公式y=sqrt(-2*ln(U))*cos(2*PI*V)计算得到x
else if(type==2)
return sqrt(-2*log(rand()/(RAND_MAX+1.0)))*cos(2*pi*rand()/(RAND_MAX+1.0));
return randn(0.0,1.0,-10.0,10.0);
int main(int argc,char* argv[])
srand((unsigned)time( NULL ));
ofstream outfile(&321.txt&);
for (int i=0;i&100;i++)
//randn(1)、randn(2)和randn(3)效果差不多
outfile && randn(3) &&
[1]&http://zh.wikipedia.org/wiki/正态分布
[2]&http://en.wikipedia.org/wiki/Normal_distribution
[3] /view/e9de620d7cd5c9?pn=2&ssid=&from=&bd_page_type=1&uid=bd__725&pu=sl@1,pw@1000,sz@224_220,pd@1,fz@2,lp@0,tpl@color,&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:188752次
积分:4885
积分:4885
排名:第2800名
原创:308篇
转载:23篇
评论:23条
(2)(6)(1)(1)(9)(5)(4)(5)(1)(1)(2)(4)(14)(25)(14)(2)(2)(6)(1)(19)(1)(9)(11)(17)(27)(19)(17)(45)(20)(25)(15)(1)(1)
http://kevin-samuel.myazure.orgc++怎样计算rand产生的随机数不同的概率_百度知道
c++怎样计算rand产生的随机数不同的概率
就是说10个学生,我想利用rand()函数随机产生他们的数字代表他们的生日,求生日各不相同的概率rand函数的种子是调用的计算机中的时间
提问者采纳
#include & iostream &
int main(){int rand_ for ( int i = 0 ; i & 10 ; i ++ ) {rand_num = rand ()%6 ;cout && rand_num &&}return 0 ; }
提问者评价
哥或姐,小弟这是真的不懂您这写到一半的程序,呼呼~~~~~~
其他类似问题
不明白你的意思!
为您推荐:
随机数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 二维概率分布 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信