產生隨機整數數 並要求隨機數的最大值 最小值和平均值
想了一天,鬱悶呀!
其實也就是在MIn 和MAX 之間選N個數 平均值是AVER
那麼可轉換為在0~(MAX-MIN) 之間選N個平均值是AVER-MIN=iAver
我們先選N個數 和是Sum 但是要求和是iAve這樣平均值才能保證。那麼就縮放
現有數值iAver*Count/Sum倍保證整數就加上0.5.這時在求和Sum1,Sum1就接近或等於iAver*Count這時在資料上在修正Sum1與iAver*Count之間的差距每個資料上修正一個單位並保證每個資料的範圍在0~(MAX-Min)之間。函式如下:
bool CAverageDlg::RandAver(UINT Count ,int Max,int Min,int Aver,int *Data)
{
if(Aver>=Max)
return FALSE;
if(Aver<=Min)
return FALSE;
if(Max==Min)
return FALSE;
if(Count==0)
return FALSE;
int iMax=Max-Min;
int iData[256]={0};
int iAver=Aver-Min;
long lSum=0;
srand((unsigned) time(NULL));
for(int i=0;i<Count;i++)
{
iData[i]=rand()%iMax;
lSum+= iData[i];
}
long lSum1=0;
for(int i=0;i<Count;i++)
{
iData[i]=iData[i]*iAver*Count*1.0/lSum+0.5;
if(iData[i]>iMax)
iData[i]=iMax;
lSum1+=iData[i];
}
int iTmp=(lSum1-iAver*Count);
if(iTmp!=0)
{
for(int i=0,j=0;i<abs(iTmp);)
{
if(iData[j]+(lSum1-iAver*Count)/abs(iTmp)<0)
{
j++;
}
else
if(iData[j]+(lSum1-iAver*Count)/abs(iTmp)>iMax)
{
j++;
}
else
{
iData[j]-=(lSum1-iAver*Count)/abs(iTmp);
j++;
i++;
}
}
}
for(int i =0;i<Count;i++)
Data[i]=iData[i]+Min;
//delete iData;
return TRUE;
}