作为一项编程练习,我认为尝试编写一个使用多个线程的程序生成随机数会很有趣。这种方法会引入混乱" OS调度程序添加随机性。
32个线程的想法是每个线程将设置一个数字的单个位(左移和'或'随机0/1)。它们每个都从a生成随机位 Mersenne Twister引擎,只是'和' 1.编辑:正如Jarod42指出的那样,每个线程都无法共享相同的随机引擎。假设每个线程拥有它自己的引擎。
std::mt19937 eng(/*some std::seed_seq to initialize*/);
此时,我将描述我对实施的看法。
一种选择是每次调用函数时启动线程。
unsigned int GetRandom() {
std::vector<std::thread> myThreads;
std::mutex numMutex;
unsigned int num = 0;
auto BitSetFunction = [&](){
std::lock_guard<std::mutex> numLockGuard(numMutex);
num <<= 1;
num |= eng() & 1;
};
for (int i=0; i<32; ++i) {
myThreads.emplace(myThreads.end(), BitSetFunction);
}
for (std::vector<std::thread>::iterator it=myThreads.begin(); it!=myThreads.end(); ++it) {
(*it).join();
}
return num;
}
然而,我怀疑并且有时看到的问题是,线程的创建通常比实际锁定,位的设置和解锁更慢。如果是这种情况,线程将按顺序执行,并且它不会那么有趣。另外,为每个调用创建线程以获取随机数的开销很大(我假设)。
有更聪明的方法吗?我想到了创建一个对象,并且从它的构造开始,线程被启动并且始终在运行,但是等待一个条件变量来知道何时产生一个新的随机数。我遇到的问题是对象的破坏,线程也被破坏并抛出错误,因为它们仍然在执行。
我只是好奇地听到其他一些想法。
答案 0 :(得分:0)
假设您有n个线程,并且您希望保证它们实际上在同一时间生成随机数。你可以这样: