生成[iLow, iHigh]之间的无重复的iCount个int型随机数

来源:互联网 发布:aide源码 编辑:程序博客网 时间:2024/06/14 09:18

/*******************************************************************************
 * 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;
}