如何用C语言生成一个正态分布的样本
例如,我给定期望和方差,如何生成一个正态分布的样本,样本数量最好由我给定.最好给出代码.玉枫孤雨,27号你回答了我的生成正态分布的题.实际上这种方法是不对的,你这样做虽然...
例如,我给定期望和方差,如何生成一个正态分布的样本,样本数量最好由我给定.最好给出代码.
玉枫孤雨,27号你回答了我的生成正态分布的题.实际上这种方法是不对的,你这样做虽然生成了n个符合正态分布函数的数据,但这些数据并不一定是符合正态分布的,比如说对于N(0,1)分布,你程序的x是平均产生在-10000到+1000的,但N(0,1)分布在各点产生的概率并不相等.所以它们并不符合正态分布,不知道你理解了吗,你可能想的简单了,不过分数给你了.你再想想吧 展开
玉枫孤雨,27号你回答了我的生成正态分布的题.实际上这种方法是不对的,你这样做虽然生成了n个符合正态分布函数的数据,但这些数据并不一定是符合正态分布的,比如说对于N(0,1)分布,你程序的x是平均产生在-10000到+1000的,但N(0,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=0;i<=N-2;i=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=0;i<N;i++){
if (rd[i]>mx)mx=rd[i];
if (rd[i]<mi)mi=rd[i];
}
//printf("mi=%lf mx=%lf\n",mi,mx);
for (i=0;i<N;i++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01;
for (i=0;i<N-2;i=i+2) printf("%lf %lf\n",rd[i],rd[i+1]);
return 0;
}
用 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=0;i<=N-2;i=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=0;i<N;i++){
if (rd[i]>mx)mx=rd[i];
if (rd[i]<mi)mi=rd[i];
}
//printf("mi=%lf mx=%lf\n",mi,mx);
for (i=0;i<N;i++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01;
for (i=0;i<N-2;i=i+2) printf("%lf %lf\n",rd[i],rd[i+1]);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#include <time.h>
#define PI 3.1415926
#define A 1/sqrt(2*PI)
main()
{
int i,n;
int num[200]={0};
float qiwang,fangcha;
double shu[100]={0.0};
double biaozhuncha,temp,x;
clrscr();
printf("input your qiwang:\n");
scanf("%f",&qiwang);
printf("input your fangcha:\n");
scanf("%f",&fangcha);
printf("input you number of yangbendian(<=200)\n");
scanf("%d",&n);
biaozhuncha=sqrt(fangcha);
for(i=0;i<=n;i++)
{
srand((unsigned)time(NULL));
x = rand() / 10000.0;
x=x*pow(-1,rand());
temp=-pow((x-qiwang),2)/(2*fangcha);
shu[i]=A/biaozhuncha*exp(temp);
}
for(i=0;i<=n;i++)
{
printf(" %-3d",num[i]);
printf(" %5.5f",shu[i]);
if(i%5==4) printf("\n");
}
}
我调试通过了,你试试吧,呵呵。
#include<math.h>
#include <stdlib.h>
#include <time.h>
#define PI 3.1415926
#define A 1/sqrt(2*PI)
main()
{
int i,n;
int num[200]={0};
float qiwang,fangcha;
double shu[100]={0.0};
double biaozhuncha,temp,x;
clrscr();
printf("input your qiwang:\n");
scanf("%f",&qiwang);
printf("input your fangcha:\n");
scanf("%f",&fangcha);
printf("input you number of yangbendian(<=200)\n");
scanf("%d",&n);
biaozhuncha=sqrt(fangcha);
for(i=0;i<=n;i++)
{
srand((unsigned)time(NULL));
x = rand() / 10000.0;
x=x*pow(-1,rand());
temp=-pow((x-qiwang),2)/(2*fangcha);
shu[i]=A/biaozhuncha*exp(temp);
}
for(i=0;i<=n;i++)
{
printf(" %-3d",num[i]);
printf(" %5.5f",shu[i]);
if(i%5==4) printf("\n");
}
}
我调试通过了,你试试吧,呵呵。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
求问:这个问题你解决了没有呢~~5年了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |