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

本文介绍了一个名为DistinctRandNumber的功能,该功能可以生成指定范围内的无重复整数随机数,并将其存储在一个数组中。该算法确保了生成的随机数既在指定区间内,又不包含重复的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值