使用C语言产生正太分布的随机数之问答篇

主题:如何用C语言产生正态分布随机数    查看完整版    作者:zmj567  时间:2008-05-27 17:46

标题:如何用C语言产生正态分布随机数        作者:zmj567  时间:2008-05-27 17:46
[size=4][font=宋体]最近正在做随机数的相关课题,想知道在C语言中,如何利用中心极限定理和Box-Muller法产生正态分布随机数,最好是有原代码,因为我真的很急,所以,请大家帮帮忙!!!

谢谢了!![/font][/size]
 
标题:        作者:hagejid  时间:2008-05-27 20:15
是不是做毕业设计的啊

先看看下面公式是不是正确的
Box-Muller方法
首先产生[0,1]区间上两个独立的均匀分布的随机数u1与u2,则:
x1=(-2lnu1)1/2 cos(2πu2)
x2=(-2lnu2)1/2 sin(2 πu2)
就是两个相互独立的服从N(0,1)分布的随机数。

用中心极限定理
用中心极限定理有可产生N(0,1)分布的随机数:
其中ui是[0,1]区间上均匀分布的随机数,i=1,2,…,6,x就是一个N(0,1)分布的一个随机数。
x=u1+u2+u3+u4+u5+u6-6
 
标题:        作者:zmj567  时间:2008-05-29 12:51
就是在作毕业设计,老师要求必须用C编写,可是C却没学好,所以一直弄不好!!!
中心极限定理不太对,还必须考虑它的均值和方差。具体似乎是:
(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(μ,σ*σ)的一个随机数。
 
标题:        作者:hagejid  时间:2008-05-27 17:46
[color=red][b]此回复于2008-06-09 09:38被 [url=http://bbs.51cto.com/profile-uid-24207.html]ribut9225[/url] 评为最佳答案[/b][/color]

看了一下,的确是错了,要加12个的
x=u1+u2+u3+u4+u5+u6+u7+u8+u9+u10+u11+u12-6

如果公式正确,那么剩下的主要问题就是产生随机数了
在C里边产生随机数的方法是用srand()设置随机种子,然后用rand()获取伪随机数
因为是伪随机数,所以评审导师会在这里卡你一下的,这部分由我们C专长的版主yangcs帮忙解答一下
还有一个问题就是均匀分布,导师也会提问
伪随机数在每个可能出现的机会都是均等的,这部分还得要版主yangcs解答一下了

#include

double p;

srand(time(0));/*种下随机种子,只种一次,在程序开始的时候用一下*/

p=(double)rand()/(double)RAND_MAX;/*得到的p就是在[0,1]区间均匀的随机数*/

两个double的强制转换是为防止某些编译器优化出错的
RAND_MAX在STDLIB头文件有定义,是编译器int表示的最大值
剩下的就是按公式做出要做的东西了
最后说明一下,一般C里边rand()函数产生的随机数是伪随机数,虽然看起来是是没规律,但还是假的
真正要产生随机数的话是用专门的电子电路,不过价格好像不低。
 
标题:        作者:zmj567  时间:2008-05-29 22:14
汗!!
好象有点懂了!!!
不好意思,想问一下,你上面提到的两个问题要如何向版主yangcs请教呢???
最后想请问一下,有完整的代码吗???
谢谢了!!!
 
标题:回复 #1 zmj567 的帖子        作者:yangcs  时间:2008-05-30 09:39
概率统计计算。在学校是肖云茹老师教的。生成的是伪随机数。程序不难,按照书上的算法写很方便的。 
标题:        作者:zmj567  时间:2008-05-31 21:13
这两种算法相关的资料!!!
在附件里!!
 
标题:        作者:chinazhanggq  时间:2008-06-06 21:38
xia lai kan kan 
标题:        作者:chinazhanggq  时间:2008-06-06 22:09
bu cuo 
标题:        作者:lshguang89  时间:2008-07-17 10:52
太好了我也在找 
标题:        作者:alucard_2005  时间:2008-12-04 20:36
啊? 不是用RANDOM函数啊- -? 我还满心希望好看到原代码的类 竟然只有2个我没见过的定理 T T 别说PERL 连C的算法也不可能知道了... 
标题:        作者:alucard_2005  时间:2008-12-04 20:33
MANAGER 布置我这道题- - 测试我C语言水平= = 我又不是计算机系的 常规学科中的C语言写这个怎么都不现实 我能把它看懂已经X天X地了 
标题:        作者:xiaoqi_n  时间:2008-09-29 10:53
很管用!谢谢! 
标题:        作者:coopery  时间:2008-11-21 23:15
不错,留着以后慢慢研究 
标题:        作者:xubiechusheng  时间:2008-12-04 16:31
dddddddddddddddd 
标题:        作者:蘡薁  时间:2010-05-18 10:34
受教啦!考来看看!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C语言中的标准库函数来生成正态分布随机数。具体步骤如下: 1. 包含头文件:`#include <stdio.h>` 和 `#include <stdlib.h>`。 2. 使用 `rand()` 函数生成一个介于0和 `RAND_MAX` 之间的随机数。 3. 将该随机数归一化到范围 [0, 1] 内,即除以 `RAND_MAX`。 4. 使用 Box-Muller 转换将归一化的随机数转换为正态分布随机数。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> double generateNormalDistribution(double mean, double stddev) { double u = (double)rand() / RAND_MAX; // 归一化到 [0, 1] double v = (double)rand() / RAND_MAX; // 归一化到 [0, 1] double z = sqrt(-2.0 * log(u)) * cos(2.0 * M_PI * v); // 使用 Box-Muller 转换 return mean + stddev * z; } int main() { double mean = 0.0; // 正态分布的均值 double stddev = 1.0; // 正态分布的标准差 srand(time(NULL)); // 初始化随机数种子 for (int i = 0; i < 10; i++) { double randomNum = generateNormalDistribution(mean, stddev); printf("%f\n", randomNum); } return 0; } ``` 在上面的示例代码中,`generateNormalDistribution()` 函数接受正态分布的均值和标准差作为参数,并返回一个正态分布随机数。`main()` 函数中的循环生成并打印了10个正态分布随机数。 请注意,这只是一个简单的示例代码,生成的随机数可能不够精确。如果需要更精确的结果,可以考虑使用更复杂的随机数生成算法或者使用专门的数值计算库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值