请问如何得到一个满足正态分布的随机数?

Cipherf 2004-11-22 01:01:06
本来是发在VB区的,转过来求助:

我希望得到一个有趋向的随机数,也就是以一个数为中心的随机数,在自然现象和社会现象中,大量随机数都服从或近似服从正态分布,所以我想用它来做我的随机算法。不知道那位高手知道如何实现?

刚才勉力把概率统计的书翻出来又啃了一下,果然还是啃不动……我们文科只学高数D,高数最简单的那一类,我还是60分过关,概率统计也是勉强及格,幸好没有遇到四大名捕……您说经济与管理学院工商管理系的学高数要干什么……不过现在知道非计算机专业的痛苦了……

大概知道正态分布就是X~N(μ,σ^2)
rnd() [VB] 产生一个0<=x<1的均匀分布的随机数,而我希望能够实现输入两个参数μ,σ2通过Rnd实现正态分布的随机数。
举个例子,希望产生某地的一个人的随机数寿命x,当输入μ=40和σ2=0.25时,此人的寿命x最可能落在40附近,比方说x在15-25岁的概率为2%(百分数乱写的,不要介意),25-35岁的概率为25%,35-45岁的概率为50%,45-55岁的概率为25%,55-65岁的概率为2%;而当μ=60时,x就最可能落在60附近了。以此类推。

我现在的方法是用一堆的if来模拟,效率实在太差了,请高手帮忙啊。

另外请您千万不要只拿理论出来,我单看理论就像看天书一样……能同时贴代码就万分感谢了~~我是用VB的,不过不是太难的C/C++的例子也看得懂。

-------------
另外再问一下,当σ2越大时,是否产生的图形越平滑,各值所可能取到的概率越相近?那么当σ2趋向于无穷大时,是否图形无限趋向于直线?

-------------
有网友提出:
aiur2000(开始.NET) ( ) 信誉:100 2004-11-22 11:32:00 得分: 0
高数也不怎么好,不过转个弯解决。
例如:25-35岁的概率为25%,35-45岁的概率为50%,45-55岁的概率为25%
转换成:25-35岁的概率为0-0.25,35-45岁的概率为0.25-0.75,45-55岁的概率为0.75-1
取随机数,若rnd(now)=0.3表示在0.25-0.75间,取35-45岁。
具体岁数可以再rnd一次;岁数=rnd(now)*10+35。
-----------

不过这正是我现在在用的用If来模拟的方法……问题有两个,一是当需要不断变换公式的参数时,要一个一个修改,效率不高;另一个是理论上正态分布是线性而不是分段的,也就是比如μ=40时,如35-45岁的概率是50%,其实是平均概率50%,实际数值应该是35岁的概率不到50%而40岁的概率超过50%,超过40岁后概率又开始下降,所以如果找不到直接变换的公式的话,既不准确又不方便啊。



...全文
267 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickone 2004-11-22
  • 打赏
  • 举报
回复
如果x~N(u,d^2),那么y=(x-u)/d~N(0,1)
如果y~N(0,1),那么x=y*d+u~N(u,d^2)
Cipherf 2004-11-22
  • 打赏
  • 举报
回复
谢楼上几位大哥,
http://dev.csdn.net/article/49/49924.shtm
在发贴以前就查到了,不过不懂如何修改使他适合我的要求?

如X1 = sqrt(-2*log(U1)) * cos(2*PI*U2);
那么X1 服从 N(0,1) 分布
我要修改那里使他服从 N(40,4)分布呢?
NowCan 2004-11-22
  • 打赏
  • 举报
回复
e底。就是ln
rickone 2004-11-22
  • 打赏
  • 举报
回复
X1 = sqrt(-2*log(U1)) * cos(2*PI*U2);
X2 = sqrt(-2*log(U1)) * sin(2*PI*U2);

公式里面的log是以什么为底的?
zzwu 2004-11-22
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/49/49924.shtm
rickone 2004-11-22
  • 打赏
  • 举报
回复
《计算机常用算法》那本书里有,我在书目上看到的,还没有看到,你可以去查一下……

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧