Qt生成随机数,不重复的随机数,递增随机数

其实,所谓的随机数只是一种绝对理想状态下的随机数,计算机生成的随机数即是随机的又是有规律的:
比如:

    srand(1);
    for(int i = 0; i < 10; ++i)
    {
        int nRandNum = rand % 10;
        cout << nRandNum ;
    }

这个生成的随机数是 [0,10)之间的一个数,每次输出都是一样的序列,那么如何让每次输出的序列不一样呢?
利用系统时间,代码如下:

    int nSeed= QDateTime::currentDateTime().time().second();
    srand(nSeed);
    for(int i =0; i < 10; ++i)
    {
        int nRandNum = (rand()%10)+80;
	    cout << nRandNum ; 
	}

秒是实时生成的,所以nSeed也会变,这就使每次输出的序列不一样。

生成随机数

在Qt中,生成随机数主要用到了函数qsrand和qrand,这两个函数在#include 中,qsrand用来设置一个种子,该种子为qrand生成随机数的起始值。比如说qsrand(10),设置10为种子,那么qrand生成的随机数就在[10,32767]之间。而如果在qrand()前没有调用过qsrand(),那么qrand()就会自动调用qsrand(1),即系统默认将1作为随机数的起始值。使用相同的种子生成的随机数一样。
下列代码生成了[0,9]之间的10个随机数。

void generateRandomNumber()  
{  
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));  
    for(int i = 0; i < 10;  i++)  
    {  
        int nNum=qrand()%10;  
        qDebug() << nNum;  
    }  
}  

注意代码中使用的种子,这里没有用固定值来作为种子,是希望函数在每次调用(间隔大于1秒)时生成的随机数不一样。

生成不重复的随机数

重复与否需要自己做判断。

void generateUniqueRandomNumber()  
{  
    int i,j;  
    QList<int> listNums;  
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));  
    for(i = 0; i < 10; i++)  
    {  
        listNums.append(qrand()%10);  
        bool bFlag = true;  
        while(bFlag)  
        {  
            for(j = 0; j < i; j++)  
            {  
                if(listNums[i] == listNums[j])  
                {  
                    break;  
                }  
            }  
            if(j < i) 
            {  
                listNums[i]=  rand()%10;  
            }  
            if(j == i)  
            {  
                bFlag = !bFlag;  
            }  
        }  
    }  
    for(i = 0; i < listNums.count(); i++)  
    {  
        qDebug() << listNums[i];  
    }  
}  

生成递增的随机数

在随机数生成后进行排序,Qt提供了一个非常好用的排序函数qSort,详细的用法可参考Qt帮助。

void generateAscendRandomNumber()  
{  
    int i;  
    QList<int> listNums;  
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));  
    for(i=0;i<10;i++)  
    {  
        listNums.append(qrand()%10);  
    }  
    qSort(listNums.begin(), listNums.end());  
    for(i = 0; i < 10; i++)  
    {  
        qDebug() << listNums[i];  
    }  
}  

输出结果如下所示,可以看出qSort默认递增排序,即使数列中包含相同的数。

0 1 1 3 4 4 6 7 7 9
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值