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