random_shuffle线程是否安全?如果不是,则使用rand_r

Mar*_*ark 13 c++ random multithreading stl

是std :: random_shuffle线程安全吗?我认为不是因为常规的rand()不是线程安全的.如果是这种情况,我将如何将rand_r与random_shuffle一起使用,以便为每个线程提供唯一的种子.我已经看到了使用随机随机生成器和random_shuffle的例子,但我仍然不清楚.

谢谢.

Jer*_*fin 4

要使用rand_rwith std::random_shuffle,您需要编写一个(相当简单的)包装器。您传递给的随机数生成器random_shuffle需要接受一个指定要生成的数字范围的参数,但事实rand_r并非如此。

你的包装看起来像这样:

class rand_x { 
    unsigned int seed;
public:
    rand_x(int init) : seed(init) {}

    int operator()(int limit) {
        int divisor = RAND_MAX/(limit+1);
        int retval;

        do { 
            retval = rand_r(&seed) / divisor;
        } while (retval > limit);

        return retval;
    }        
};
Run Code Online (Sandbox Code Playgroud)

你可以将它与random_shuffle类似的东西一起使用:

std::random_shuffle(whatever.begin(), whatever.end(), rand_x(some_seed));
Run Code Online (Sandbox Code Playgroud)