gpt4 book ai didi

c++ - 并发随机数生成

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:22 30 4
gpt4 key购买 nike

我正在使用 open mp 编写一个并行程序,在其中我生成一个随机 float 矩阵,然后对其进行一些计算。我目前想让生成矩阵的步骤并行运行,但我遇到了 rand() 函数不打算同时运行的问题。我不想使用锁在 rand 上提供互斥锁,因为这是循环中唯一要做的事情,顺序运行它可能会更有效率。有什么方法可以并行高效地执行此步骤?

这里是这部分的当前代码(rand 上没有互斥锁);

#pragma omp parallel default(private)
{
int i= omp_get_thread_num();
for(int j=0; j<cols; j++)
matrix[i][j]= rand()%1000 + (float)(rand()%100)/(float)(rand()%1000);
}

最佳答案

如果您使用的是 C++,则应考虑使用 Boost library random number classes .您可以为每个线程创建一个唯一的 PRNG 实例。如果您需要可重复性,您可以使用可重复生成的种子值在主线程中初始化每个实例。

更新:结果是在我写完这篇文章后,C++11 发布了,它包含一个更现代的用于生成随机数的库。它包括std::uniform_int_distributionstd::std::uniform_real_distribution ,两者都依赖于生成器,例如 std::mersenne_twister_engine (或特定配置 std::mt19937)。例如:

#include <random>
#include <iostream>

int main() {
std::mt19937 gen; // Uses default seed value to generate repeatable sequence
std::uniform_int_distribution<int> d20(1,20);
std::uniform_real_distribution<float> prob(0.0, 1.0);

std::cout << d20(gen) << std::endl;
std::cout << prob(gen) << std::endl;

return 0;
}

关于c++ - 并发随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234480/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com