random_shuffle线程安全吗?如果不是,则使用rand_r
Is random_shuffle threadsafe? and using rand_r if it is not
std::random_shuffle线程安全吗?我认为不是,因为常规的rand()不是线程安全的。如果是这种情况,我将如何使用rand_r和random_shuffle,以便我可以给每个线程一个唯一的种子。我已经看到了使用自定义随机生成器和random_shuffle的例子,但我仍然不清楚。
谢谢。
要使用rand_r
和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;
}
};
与random_shuffle
一起使用,例如:
std::random_shuffle(whatever.begin(), whatever.end(), rand_x(some_seed));
您需要提供一个随机数生成器函数或函数对象,该函数或函数对象接受整型值,并返回另一个整型值,该值不会超出您传递给函数的迭代器正在迭代的容器的边界。同样,对于functor对象,它必须实现operator()
,以便它可以像函数一样被调用。因为你需要一个线程安全的随机数生成器,使用srand
和rand
从cstdlib
是一个坏主意…相反,你应该创建一些函数函数对象来实现线程安全的随机数生成器,或者创建一个不实现全局可访问变量的随机数生成器,以便所有内容都保持线程本地存储。
例如,一种可行的方法是,你从另一个库中获得某种类型的随机数生成器,它只会在固定范围内生成随机值,因此你可以为random_shuffle
算法使用的随机访问迭代器定义容器的边界。现在,根据您使用的库,您的函子可能看起来像下面这样:
class my_rand_gen
{
private:
random_gen_type random_range_gen;
int min;
int max;
public:
my_rand_gen(const random_gen_type& gen, int min_range, int max_range):
random_range_gen(gen), min(min_range), max(max_range) {}
int operator()(int value)
{
//ignore the input value and use our own defined range
//returns a value between min and max
return random_range_gen(min, max);
}
};
现在你可以这样调用这个算法:
random_shuffle(my_vector_start_iter, my_vector_end_iter,
my_rand_gen(rand_generator_lib,
vector_start_index,
vector_end_index));
,它会将开始迭代器和结束迭代器之间的向量洗牌到你的向量,而不会溢出向量的边界…换句话说,它将只使用vector_start_index
和vector_end_index
之间的洗牌值。
可能不会。
使用第二个版本的adnrom_shuffle,它接受随机数生成器的模板参数:http://www.sgi.com/tech/stl/random_shuffle.html。生成器必须匹配:http://www.sgi.com/tech/stl/RandomNumberGenerator.html
struct MyRandomNumberGenerator
{
int operator()(int limit) const
{
// get threadsafe random number
}
};
// Stuff
random_shuffle(list.begin(), list.end(), MyRandomNumberGenerator());
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 如果不是多个语句,请使用 if 语句
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?
- 如果不分配内存,我如何能够为变量创建和分配值?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 删除 QGraphicsPixmapItem (如果它已添加到场景中).如果不添加到场景
- 从库中发出信息,而无需运行时成本(如果不需要)
- 可能的模板和constexpr - 如果不兼容
- 如果不是这样,我需要帮助理解这个嵌套的问题
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?
- 如果不手动完成,子类是否继承父类的析构函数?
- 如果不是十六进制,则QT从qlineedit中删除字符
- 如果不有效,如何重复用户输入电子邮件
- RE2 语法:如果不共享相同的前缀,则跳过匹配
- 如果不允许使用constexpr,为什么sfinae在上面
- fscanf:如果不返回 EOF,是否可能出现错误或 EOF?
- 打开文件,如果不存在,则创建,确定是否创建
- 仅接受字母/字母以输入变量,如果不是字母,请重复出现