1. 程式人生 > >產生隨機整數數 並要求隨機數的最大值 最小值和平均值

產生隨機整數數 並要求隨機數的最大值 最小值和平均值

想了一天,鬱悶呀!

其實也就是在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;

}