问题
在做一个qt的课程设计时,需要一个产生随机数(四位不同数字的随机数)的方法,查了一下资料发现很简单调用一下qrand()方法即可。确实也能产生随机数但是发现一个bug就是每次重启程序发现每次产生的随机数都是相同的。
代码如下:
//获取随机数
int MainWindow::generateRandomNumber(){
int tag[]={0,0,0,0,0,0,0,0,0,0};
int four=0;
int temp=10;
while(four<1000){
temp=qrand()%10;//随机获取0~9的数字
if(tag[temp]==0){
four+=temp;
four*=10;
tag[temp]=1;
}
}
for (int i=0;i<10;i++) {
qDebug()<<i<<": "<<tag[i]<<endl;
}
return four;
}
这是为什么呢?
不是说好了是随机数吗?
又仔细翻阅了资料发现如果我们仅仅只是调用该函数来生成随机数,那么每次得到的随机数都将是相同的,这是因为Qt生成的随机数严格来说是一个“伪随机”,它的产生是根据随机数种子计算得到的。如果种子相同,那么所得到的随机数也是相同的。 在上面的代码中由于每次的随机数种子是一样的导致了每次程序重启后产生的随机数都是相同的。
那怎么改呢?
为了使我们的随机数看起来更为“随机”一些,我们在每次获取随机数之前都需要初始化一个不同的随机数种子,这就需要用到qsrand()函数,该函数只有一个整型参数,即要设置的随机数种子。
函数原型
void qsrand(uint seed);
int qrand();
QT生成随机数和C语言差距不大,C语言用srand()和rand(),QT是用Qsrand()和qrand();
QT生成随机数的格式是:
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
qrand();
只需将上面的代码修改即可:
//获取随机数
int MainWindow::generateRandomNumber(){
int tag[]={0,0,0,0,0,0,0,0,0,0};
int four=0;
int temp=10;
while(four<1000){
//设置随机数种子,否则每次得到的随机数都相同使得"不随机"
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
temp=qrand()%10;//随机获取0~9的数字
if(tag[temp]==0){
four+=temp;
four*=10;
tag[temp]=1;
}
}
for (int i=0;i<10;i++) {
qDebug()<<i<<": "<<tag[i]<<endl;
}
return four;
}