本算法参考了:
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;
}