机会均等的随机分配

本算法参考了:

http://www.softrank.net/html/development/2009/0405/128.html

 

// 0 ~ nMax (包含 0、不包含nMax)
int Rand(int nMax)
{
 return  rand() % nMax;

}

 

// 平均随机分配
// iTotal: 待分配的总量
// iNum:   需要分成的份数
// pData:  返回分配结果
// 成功返回true, 失败返回false
bool RandAssign(int iTotal, int iNum, int* pData)
{
 if(iTotal < 0 || iNum <= 0 || pData == 0)
 {
  return false;  
 }

 // 填充
 for(int i=0; i<iNum; i++)
 {
  pData[i] = 0; 
 }

 if(iTotal == 0)
 {
  // 全部是0
  return true;
 }

 if(iNum == 1)
 {
  // 1个的特殊处理
  pData[0] = iTotal;
  return true;  
 }

 if(iNum == 2)
 {
  // 2个的特殊处理
  pData[0] = Rand(iTotal+1);
  pData[1] = iTotal - pData[0];
 }

 if(iTotal <= iNum)
 {
  // 数据总量比数据个数还少
  for(int i=0; i<iTotal; i++)
  {
   pData[Rand(iNum)] ++;
  }

  return true;
 }

 // 分段算法
 // 分段标志
 for(int i=0; i<iNum-1; i++)
 {
  pData[i] = Rand(iTotal+1);
 }
 // 最后1个
 pData[iNum - 1] = iTotal;

 // 排序
 std::sort(pData, pData+iNum);
 // 取分段值(从后向前)
 for(int i=iNum-1; i>=1; i--)
 {
  pData[i] -= pData[i-1];
 }
 
 return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值