提问者:小点点

在短时间内生成具有从1到100.000.000的随机数的表,而没有任何二次


对于一个项目,我是否需要创建一个表,以随机顺序存储100.000.000个数字,而不需要任何双倍,然后将这些数字保存为.csv文件。

void Anonym_Option::GenerateTable(){
    ui->progressBar->setValue(0);
    QList<int> l(100000000);
    std::iota(l.begin(), l.end(), 0);

    QVector<QList<int>::iterator> v(l.size());
    std::iota(v.begin(), v.end(), l.begin());

    ui->progressBar->setValue(10);

    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    auto rng = std::default_random_engine {seed};

    QCoreApplication::processEvents();
    std::shuffle(v.begin(), v.end(), rng);

    QString SortString;
    QString CombinedString;

    ui->progressBar->setValue(30);

    for (auto z: v){
        QCoreApplication::processEvents();
        SortString += QString::number(*z) + "," + "\n";
    }

    ui->progressBar->setValue(70);

    CombinedString = SortString.replace(QString("\n;"), QString("\n"));

    QString Table = "Generated ID; \n" + CombinedString;

    ui->progressBar->setValue(90);

    QString Path = QDir::currentPath();
    QFile file(Path + "/Table.csv");
    if (!file.open(QFile::WriteOnly | QFile::Text)){
        QMessageBox::warning(this, "ACHTUNG","ACHTUNG! Der Anonymisierungs-Table kann nicht generiert werden! Bitte Kontaktieren sie den Support.");
        return;
    }
    else{
        QTextStream stream(&file);
        QCoreApplication::processEvents();
        stream << Table;
        ui->progressBar->setValue(100);
        hide();
        anonymisierung = new Anonymisierung();
        QTimer::singleShot(1500,anonymisierung,SLOT(show()));
    }
}

该表的目的是替换Customer文件中的数字,使其匿名。我的代码存在的问题是,当我使用10000.000个数字时,它需要大约8分钟来完成,但当我使用10000.000个数字时,它似乎需要更多的内存和时间,而不是实际需要。我可以在这个函数中本地化问题吗

    for (auto z: v){
        QCoreApplication::processEvents();
        SortString += QString::number(*z) + "," + "\n";
    }

它的全部目的是在每个数字后面加上一个“,”和“\n”,这样它就会被相应地分离出来,以后就可以使用了。有什么办法加快进度吗?

我使用QT6在希望范围,可悲的是还没有实现,所以不是一个选项,我可以使用!


共1个答案

匿名用户

如果您的随机性程度不需要比rand()的典型实现好,那么定义您可以使用线性共轭生成器,该生成器的属性是在达到周期性之前不会重复,并且不包括范围之外的数字。

下面的程序在我的机器上运行不到一秒钟,并将生成一个文件,该文件包含[0,100000000]范围内的所有数字,没有重复。

#include <iostream>

int main()
{
    std::uint32_t I = 128;
    for (std::uint32_t i = 0; i < -1; ++i){
        I = 1664525 * I + 1013904223;
        if (I <= 100000000){
            printf(">%d<\n", I);
        }
    }
}

根据您的系统时间时钟选择i(种子)的初始值。

这一步中的神奇数字要归功于了不起的科学程序员唐纳德·克努斯。