主题:如何求数据的中位数median和均值函数mean?
我不知道如何将下面的几个函数整合在一起求数据的中位数median和均值函数mean?
希望高手予以帮助,先谢谢大家了。以前都用R编程,只要输入几个命令即可,C语言果然博大精深啊!
//首先生成50个poisson随机数
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
//for link
double uniform(double a,double b,long int *seed); /*均匀分布*/
int poisson(double lambda,long int *seed); /*泊松分布*/
/*******************************************************************
* 求[a,b]上的均匀分布
* 输入: a--双精度实型变量,给出区间的下限
* b--双精度实型变量,给出区间的上限
* seed--长整型指针变量,*seed为随机数的种子
********************************************************************/
double uniform(double a,double b,long int *seed)
{
double t;
*seed=2045*(*seed)+1;
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;
return(t);
}
/************************************************************************/
/* 泊松分布 */
/************************************************************************/
int poisson(double lambda, long int *seed)
{
int i,x;
double a,b,u;
a=exp(-lambda);
i=0;
b=1.0;
do {
u=uniform(0.0,1.0,seed);
b*=u;
i++;
} while(b>=a);
x=i-1;
return(x);
}
/************************************************************************/
/* 泊松分布的例子,生成50个poisson(4) */
/************************************************************************/
void main()
{
double a,b,x;
int i,j;
long int s;
a=4; /*lambda*/
b=0.7;
s=13579; /*seed*/
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
x=poisson(a,&s);
printf("%-13.7f",x);
}
printf("\n");
}
system("Pause");
return 0;
}
//编写中位数的函数
/* Sample Median */
double median(x,n)
float *x;
int n;
{
rsort(x,n);
return 0.5*(x[(int)(0.5*n-0.01)]+x[(int)(0.5*n+0.01)]);
}
//rsort 函数
rsort(x,n)
float *x;
int n;
{
int i, j, h;
float v;
if( n<=1 ) return;
h = 1;
while( h<n )
h = 3*h+1;
do {
h = h/3;
for( i=h ; i<n ; i++ ) {
v = x[i];
j = i;
while( x[j-h] > v ) {
x[j] = x[j-h];
j = j-h;
if( j<h ) goto out;
}
out: x[j] = v;
}
}
while( h!=1 );
}
//mean函数
double mean(x,n)
float *x;
int n;
{
double sum;
int i;
sum = 0.;
for( i=0 ; i<n ; i++ )
sum += x[i];
return sum/n;
}
希望高手予以帮助,先谢谢大家了。以前都用R编程,只要输入几个命令即可,C语言果然博大精深啊!
//首先生成50个poisson随机数
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
//for link
double uniform(double a,double b,long int *seed); /*均匀分布*/
int poisson(double lambda,long int *seed); /*泊松分布*/
/*******************************************************************
* 求[a,b]上的均匀分布
* 输入: a--双精度实型变量,给出区间的下限
* b--双精度实型变量,给出区间的上限
* seed--长整型指针变量,*seed为随机数的种子
********************************************************************/
double uniform(double a,double b,long int *seed)
{
double t;
*seed=2045*(*seed)+1;
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;
return(t);
}
/************************************************************************/
/* 泊松分布 */
/************************************************************************/
int poisson(double lambda, long int *seed)
{
int i,x;
double a,b,u;
a=exp(-lambda);
i=0;
b=1.0;
do {
u=uniform(0.0,1.0,seed);
b*=u;
i++;
} while(b>=a);
x=i-1;
return(x);
}
/************************************************************************/
/* 泊松分布的例子,生成50个poisson(4) */
/************************************************************************/
void main()
{
double a,b,x;
int i,j;
long int s;
a=4; /*lambda*/
b=0.7;
s=13579; /*seed*/
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
x=poisson(a,&s);
printf("%-13.7f",x);
}
printf("\n");
}
system("Pause");
return 0;
}
//编写中位数的函数
/* Sample Median */
double median(x,n)
float *x;
int n;
{
rsort(x,n);
return 0.5*(x[(int)(0.5*n-0.01)]+x[(int)(0.5*n+0.01)]);
}
//rsort 函数
rsort(x,n)
float *x;
int n;
{
int i, j, h;
float v;
if( n<=1 ) return;
h = 1;
while( h<n )
h = 3*h+1;
do {
h = h/3;
for( i=h ; i<n ; i++ ) {
v = x[i];
j = i;
while( x[j-h] > v ) {
x[j] = x[j-h];
j = j-h;
if( j<h ) goto out;
}
out: x[j] = v;
}
}
while( h!=1 );
}
//mean函数
double mean(x,n)
float *x;
int n;
{
double sum;
int i;
sum = 0.;
for( i=0 ; i<n ; i++ )
sum += x[i];
return sum/n;
}