【问题标题】:Thread separated random int generation in C++C ++中的线程分离随机int生成
【发布时间】:2022-01-06 03:54:46
【问题描述】:

我需要生成三个填充随机整数的 .txt 文件,在分离的线程中调用生成函数。

问题是我在每个 .txt 文件中都有相同的值。

生成和写入值的函数:


        void generateMoves(int limit, std::string outputPath) {
        //open fstream
        std::ofstream fout;
        fout.open(outputPath);
        if (!fout.is_open()) {
            std::cout << "Error reading " << outputPath << " file. Exiting..." << std::endl;
            exit(1);
        }
    
        static thread_local std::mt19937 generator;
        std::uniform_int_distribution<int> distribution(1, 3);
    
        //generating & writing moves
        for (int i = 0; i < limit; i++) {
            
            int value;
            value = distribution(generator);
            fout << value << std::endl;
        }
    
        fout.close();
    }

我从 main() 调用这样的线程:

    int limit = 1000;
    std::thread player1(generateMoves, limit, "player1.txt");
    std::thread player2(generateMoves, limit, "player2.txt");
    std::thread player3(generateMoves, limit, "player3.txt");

    player1.join();
    player2.join();
    player3.join();

那么,如何正确分离 int 生成?

编辑:按照下面的评论,我将不同的种子放入每个线程中,现在一切正常。随机生成现在看起来像这样:

    // put different *s* into each thread
    srand(s);
    //generating & writing
    for (int i = 0; i < limit; i++) {
        int value;
        value = rand() % 3 + 1;
        fout << value << std::endl;
    }

【问题讨论】:

  • 在构造函数中使用种子值。您正在使用相同(默认)种子构建所有生成器
  • 不,这实际上是一个更糟糕的解决方案。现在所有三个线程都在使用系统提供的(相当糟糕的)单个随机生成器。
  • 这并没有解决问题,而是养成使用有意义的值初始化对象的习惯,而不是默认初始化它们并立即覆盖默认值。在这种情况下,这意味着将std::ofstream fout; fout.open(outputPath); 更改为std::ofstream fout(outputPath);

标签: c++ multithreading random fstream


【解决方案1】:

正如 cmets 所述,您的所有生成器都是从相同的默认种子创建的。给每个生成器一个不同的种子就足够了:

std::random_device rd1;
static thread_local std::mt19937 generator(rd1());

这使用(非常慢的)std::random_device,但只是为 mt 生成器生成一个唯一的种子。

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 2020-01-31
    • 2015-06-24
    • 1970-01-01
    • 2014-05-21
    • 2012-02-07
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多