声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5999|回复: 5

[C/C++] [求助]如何用C语言产生正态分布随机数

[复制链接]
发表于 2008-5-26 14:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近正在研究随机数产生算法,所以想请教一下,如何用C语言产生正态分布随机数,主要是利用Box-Muller和中心极限定理两种算法产生的。
      请高手帮帮忙,谢谢了!!!
回复
分享到:

使用道具 举报

发表于 2008-5-27 22:43 | 显示全部楼层
先产生01之间的均匀随机数,再用取舍法,取舍法你可在网上随便查查,资料很多,而且简单,我用过很多次
 楼主| 发表于 2008-5-29 12:57 | 显示全部楼层
查了很多,可是因为C没学好,所以还是不会,郁闷啊!!!
发表于 2008-5-31 19:33 | 显示全部楼层

看一本书

我推荐一本书,里面的方法说的很明确,清华大学的《系统建模与仿真》,齐欢老师的,里面第七章专门讲如何产生随机变量

评分

1

查看全部评分

发表于 2008-8-30 14:45 | 显示全部楼层

回复 沙发 xuxinnuaa 的帖子

先产生01之间的均匀随机数,然后按给定分布拟合就可以了(数字图像中有这些知识)
如直方图均衡化就是用这种方法
发表于 2008-9-5 09:45 | 显示全部楼层
Box-Muller方法
首先产生[0,1]区间上两个独立的均匀分布的随机数u1与u2,则:
               x1=(-2lnu1)1/2 cos(2πu2)
               x2=(-2lnu2)1/2 sin(2 πu2)
就是两个相互独立的服从N(0,1)分布的随机数。

中心极限定理:
(1)从计算机中产生U(0,1)均匀分布的随机数30个(当然,也可以是任意个,m越大越好,主要是符合中心极限定理的条件),记为u1, u2,...,u30;由于E(ui)=1/2,D(ui)=1/12(i=1,2,...,30)根据中心极限定理,可以认为近似服从均值为Σ=ui (其中i=1,2,...,30)近似服从均值为1/2*30=15,方差为1/12*30=2.5的正态分布。
(2)计算:v=(u1+u2+...+u30-15)/(2.5)1/2,由中心极限定理,它可以看作是来自标准正态分布N(0,1)的一个随机数;
(3)变换:x=μ+σv,由正态分布的性质可知,它可以看作是来自正态分布N(μ,σ*σ)的一个随机数。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 21:41 , Processed in 0.063113 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表