Qt生成随机数,不重复的随机数,递增随机数
  yQAl4kecrO8W 2023年12月22日 24 0


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

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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
  BYaHC1OPAeY4   2024年05月08日   56   0   0 C++
  TKwJ4YzyA8uz   2024年05月17日   43   0   0 C语言
  V88gxnVgnp1F   2024年05月08日   92   0   0 C语言
  6Df3JnWQUC5m   2024年05月08日   82   0   0 C语言
  o1ZcTI9mJsxK   2024年05月08日   121   0   0 C语言
  6Df3JnWQUC5m   2024年05月17日   54   0   0 C语言
  oXKBKZoQY2lx   2024年05月17日   56   0   0 C++
yQAl4kecrO8W