我的程序需要在某个范围内生成许多随机整数(int min,int max).每次通话都有不同的范围.什么是好的(最好是线程安全的)方法呢?以下不是线程安全的(并使用rand(),人们似乎不鼓励):
int intRand(const int & min, const int & max)
{
return (rand() % (max+1-min)) + min;
}
Run Code Online (Sandbox Code Playgroud)
这要慢得多,但使用<random>:
int intRand(const int & min, const int & max) {
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
return distribution(generator);
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西就是我想要的(虽然changeParameters函数不存在):
int intRand(const int & min, const int & max) {
static std::default_random_engine generator;
static std::uniform_int_distribution<int> distribution(0, 10);
distribution.changeParameters(min, max);
return distribution(generator);
}
Run Code Online (Sandbox Code Playgroud)
另一个选择是uniform_int_distribution在第一个例子中使用mod然后使用mod.但是,我正在进行统计工作,所以我希望数字来自尽可能无偏差的分布(例如,如果使用的分布范围不是(max-min)的倍数,则分布将略微偏置).这是一个选择,但同样,我想避免它.
解决方案此解决方案来自@ konrad-rudolph @ mark-ransom和@mathk的答案.随机数发生器的播种是为了满足我的特殊需要.更常见的方法是使用时间(NULL).如果你在同一秒内制作了很多线程,那么他们就会获得相同的种子.即使使用clock()也是一个问题,所以我们包含了线程ID.缺点 - 这会泄漏内存 - 每个线程一个生成器.
#if …Run Code Online (Sandbox Code Playgroud)