10 ^6 个数据样本的均匀采样程序,该程序有一个输入参数:L属于{1,2,3,4,5},要求你所编写的程序维持一个大小为L样本集合A(A是一个只能存储L个整数的数组),使得在任意第t>L秒,当前窗口W ^ t中的元素以相等的概率被存储在A中(即被选取到A中)。所设计的程序对于所有的元素S=e(1),e(2),e(3),…,e(10^6)只能读取一遍,不能将整个S中的元素都存在一个数组中在进行采样。
#include <stdio.h>
#include <stdlib.h>
int k;
int time_stamp=0;
void Reservior(int *sample,int t);
int main()
{
int i;
int data,t;
float m,n;
double total_num;
int sum;
int *sample;
while(1)
{
total_num=0;
sum=0;
printf("输入滑动窗口大小:");
scanf("%d",&k);
sample = (int *)malloc(k * sizeof(int));
FILE *fp=fopen("./data_for_programme1.txt","r");
while(!feof(fp))
{
fscanf(fp,"%d",&data);
total_num += data;
if(time_stamp<k)
{
*(sample+time_stamp) = data;
}
else
{
t = data;
}
time_stamp++;
Reservior(sample,t);
}
for(i=0;i<k;i++)
{
sum += sample[i];
}
m=total_num/time_stamp*1.0;
n=sum/k;
printf("精确的均值为: %.3f\n",m);
printf("估计的均值为: %.3f\n",n);
printf("误差为:%f\n",(n-m)/m);
time_stamp=0;
}
return 0;
}
void Reservior(int *sample,int data)
{
int i,j;
j=rand()%time_stamp;
if(j<=k)
{
sample[j-1]=data;
}
}