/*******************************************************************************
* Function : DistinctRandNumber
* Description : 生成[iLow, iHigh]之间的无重复的iCount个int型随机数,存放在数组aiNumber中
* Parameters : (1) const int iLow :要生成的随机数的最小值
* (2) const int iHigh :要生成的随机数的最大值
* (3) const int iCount : 要生成的随机数个数
* (4) int aiNumber[] : 存放生成的iCount个随机数
* Return : int =0表示成功,其它表示失败
* Notes : iLow应该小于iHigh,iCount应该不大于(iHigh - iLow + 1)
******************************************************************************/
int DistinctRandNumber(const int iLow, const int iHigh, const int iCount,
int aiNumber[])
{
if (iLow >= iHigh)
{
return -1;
}
// 最多可能产生的随机数个数
const int iTotal = iHigh - iLow + 1;
// 所需要的个数大于最多可能产生的随机数个数
if (iCount > iTotal)
{
return -1;
}
// 将随机数可能的取值先存放在一个数组中
int* piTemp = new int[iTotal];
if (!piTemp)
{
return -1;
}
// 初始化数组
int i;
for (i = 0; i < iTotal; i++)
{
piTemp[i] = i + iLow; // 随机数可能的取值
}
srand((unsigned int) time(NULL));
int iRange = iTotal;
int iIdx;
int j;
for (j = 0; j < iCount; j++)
{
iIdx = rand() % iRange; // iIdx为[0,iRange)范围内数组下标
aiNumber[j] = piTemp[iIdx]; // 取这个下标的随机数
piTemp[iIdx] = piTemp[iRange - 1]; // 将这个已经使用过的随机数从数组中移除(用最后一个元素覆盖)
iRange--; // 随机范围减1
}
delete[] piTemp;
return 0;
}