【发布时间】:2020-06-01 22:23:32
【问题描述】:
我有以下代码,我需要在给定的间隔内有一个随机数。似乎按我的需要工作。
std::default_random_engine eng;
std::uniform_int_distribution<int> dist(3, 7);
int timeout = dist(eng);
然后我在不同的线程中运行它并在循环中重复。
std::default_random_engine defRandEng(std::this_thread::get_id());
std::uniform_int_distribution<int> dist(3, 7);
int timeout; // if I put timeout = dist(defRandEng); here it's all the same
while (true)
{
timeout = dist(defRandEng);
std::cout<<"Thread "<<std::this_thread::get_id()<<" timeout = "<<timeout<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(timeout));
}
但是对于所有线程中的每次迭代,值都是相同的
Thread 139779167999744 timeout = 6
Thread 139779134428928 timeout = 6
Thread 139779067287296 timeout = 6
Thread 139779117643520 timeout = 6
Thread 139779100858112 timeout = 6
Thread 139779084072704 timeout = 6
Thread 139779151214336 timeout = 6
Thread 139779050501888 timeout = 6
Thread 139779033716480 timeout = 6
下一次互动
Thread 139779167999744 timeout = 4
Thread 139779151214336 timeout = 4
Thread 139779134428928 timeout = 4
Thread 139779117643520 timeout = 4
Thread 139779100858112 timeout = 4
Thread 139779084072704 timeout = 4
Thread 139779067287296 timeout = 4
Thread 139779050501888 timeout = 4
Thread 139779033716480 timeout = 4
【问题讨论】:
-
它不是线程安全的......
-
一个 C++ minimal reproducible example 有一个
main,所有需要的#include指令等。足够让其他人看到可以复制、粘贴和开始分析,所以每个人都可以看到其他细节这可能最终很重要。 -
minimal reproducible example 的真正魅力在于,如果不及时发现并解决问题,就很难做出一款出色的产品。当您删除不相关的代码时,该错误隐藏的空间就更少了,并且当您检查代码以确定它是否不相关时,检查可以摆脱问题。
-
除了这是高度怀疑并且不应该发生的事实之外,您错误地为您的生成器播种。我不知道
default_random_engine是什么(因此它应该永远被使用)但是你可能没有给它足够的熵来播种它的整个内部状态,这会导致退化的结果(尽管如此,仍然不太可能在不同的种子中产生相同的序列)。我意识到这很难做到。不幸的是,C++ 随机数生成器很糟糕。