Qt rand()无法正常工作

时间:2017-04-13 09:34:54

标签: c++ qt c++11 random numbers

我想显示0到99 999之间的1000个随机数。但是有一个奇怪的问题。它显示1000个数字,但没有一个高于aprox。 35 000.为什么会这样?

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    int ran;

    qsrand(qrand());

    for (int i=0; i<1000; i++){
        ran = qrand() % 100000;
        qInfo() << ran;
    }    

    return a.exec();
}

控制台向我展示的是:

  

18103   76   22033   25191   5349   13724   11988   25919   32568   20303   17393   14983   4038   443   16566   18275   8687   23110   24124   31899   20267   2336   22086   3570   6406   29490   32107   13236   29800   8273   18552   10895   6682   22968   16656   26019   16518   3253   11669   9948   8894   17826   28748   29056   30912   22295   25019   2820   17657   350   10838   32292   6919   11815   24411   21555   17347   5245   26363   30895   25215   22777   26554   31512   32652   32310   18200   8962   7168   14724   31601   2666   12981   32737   13602   12870   19093   24357   8941   17759   32277   30588   21919   32099   7168   10521   1775   24118   17782   18985   18346   15242   11572   30982   22797   15535   23574   24238   13682   21164   7897   30067   3120   21646   294   10228   13500   13824   31180   23627   23828   3100   11342   16264   30557   21633   25501   25951   10954   12966   10790   4125   19393   5998   8975   13536   7993   1788   2238   4104   28007   28872   29852   24041   10137   19954   21528   3010   9570   31191   12014   29939   15607   30947   8873   106   15065   8614   14182   12895   31924   23593   29148   1601   13191   27522   18073   9456   4358   30118   21134   19244   25661   15743   31950   29774   26997   17214   26003   7477   20827   16115   18050   13188   17247   10586   10288   1291   24411   18168   4324   17282   629   26983   4255   28797   21318   23279   20057   17820   22844   10326   31374   27906   9020   15608   19193   7689   16780   1306   25504   29236   5873   2683   20752   1638   17684   16172   30698   15441   14378   27298   7582   12336   5588   27914   28279   14009   4932   19676

请参阅?这些数字都不高于35000.我错了什么?

1 个答案:

答案 0 :(得分:2)

问题

实际上它是32767.在这种情况下的行为与标准rand()相同:

  

返回0到RAND_MAX之间范围内的伪随机整数。

qrand()文档中的类似声明:

  

返回介于0和RAND_MAX之间的值(在<cstdlib><stdlib.h>中定义)。

显然你的RAND_MAX等于32767(2¹⁵ - 1)。

解决方案

解决方案是使用C ++ 11随机数生成器:

#include <random>

// ...

std::random_device rd;
std::mt19937 mt(rd());
const int MIN = 0;
const int MAX = 99999;
std::uniform_int_distribution<int> ds(MIN, MAX);
for (int i = 0; i < 1000; ++i) {
    qDebug() << ds(mt);
}