- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我被要求不要使用 rand()
,因为它们不是“线程安全的”,并且每次也使用不同的种子值。我在 GitHub 上找到了使用如下种子值的示例:
unsigned int seed = time(NULL);
这只有几秒钟的精度。由于程序在 1 秒内运行,我最终得到每个实例相同的随机数。
我将如何修复此算法,使其仅使用 rand_r()
或任何其他“线程安全”方法来生成 10 个随机数?
int main()
{
for(int i = 0; i < 10; i++){
int random;
unsigned int seed = time(NULL);
random = 1 + (rand_r(&seed)% 10);
printf("%d\n",random);
}
return 0;
}
最佳答案
rand_r
函数接受一个指向状态变量的指针。这在第一次调用 rand_r
之前设置为种子值。然后每次调用 rand_r
时,都会传入这个值的地址。
为了线程安全,每个线程都需要有自己的状态变量。但是,您不想为每个线程的状态变量使用相同的初始值,否则每个线程都会生成相同的伪随机值序列。
您需要使用每个线程的不同数据(例如线程 ID)以及其他信息(例如时间和/或 pid)来为状态变量播种。
例如:
// 2 threads, 1 state variable each
unsigned int state[2];
void *mythread(void *p_mystate)
{
unsigned int *mystate = p_mystate;
// XOR multiple values together to get a semi-unique seed
*mystate = time(NULL) ^ getpid() ^ pthread_self();
...
int rand1 = rand_r(mystate);
...
int rand2 = rand_r(mystate);
...
return NULL;
}
int main()
{
pthread_t t1, t2;
// give each thread the address of its state variable
pthread_create(&t1, NULL, mythread, &state[0]);
pthread_create(&t2, NULL, mythread, &state[1]);
...
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
关于c - 如何使用 rand_r() 在 C 中创建线程安全的随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43151361/
嗯,rand_r 函数应该是一个线程安全函数。然而,通过它的实现,我不敢相信它可以使自己不被其他线程改变。假设两个线程将使用相同的变量种子同时调用 rand_r。所以会发生读写竞争。下面列出了 gli
所以,我很好奇如何有人可以使用 rand_r 命令跨多个线程获取随机值。如果我对种子使用时间(NULL),那么每个人都会得到相同的种子,因为线程创建得非常接近。这些操作都基于该随机种子,因此所有线程对
我在使用 rand_r 时遇到了问题。我有一个生成数百万个随机数的模拟。我注意到,在某个时间点,这些数字不再统一。可能是什么问题? 我做什么:我创建了一个生成器的实例并给它自己的种子。 mainRGe
我正在尝试学习如何使用 rand_r,在阅读了 this question 之后我仍然有点困惑,有人可以看看并指出我错过了什么吗?据我了解, rand_r 需要一个指向某个值(或具有某些初始值的内存)
当我在 vs2008 中使用 rand_r() 时,出现 1 个错误--Identifier is undefined,我可以改用 rand() 吗? (多线程编程工作。)谢谢。 最佳答案 你必须 #
我正在尝试在 C++ 中获取一个随机数,并且我正在使用 rand()。这就是 cpplint说: Consider using rand_r(...) instead of rand(...) for
我被要求不要使用 rand(),因为它们不是“线程安全的”,并且每次也使用不同的种子值。我在 GitHub 上找到了使用如下种子值的示例: unsigned int seed = time(NULL)
我想改变 rand_r 方法对 srand/rand 的使用或与其他带种子的随机生成器一起使用。 在代码中有一个循环调用带有种子的train方法。 int nseeds = 5; for (int s
我想知道为什么在包含 cstdlib 时我不能使用 std::rand_r?或者,更一般地说,为什么 cstdlib 中的某些函数在全局命名空间中,但不在 std 命名空间中? 最佳答案 rand_r
所以我有多个线程将使用 rand_r 函数。这个函数的签名是: int rand_r(int *val); 我试图利用这段时间为这个函数做种子,但我遇到了各种各样的麻烦。任何人都可以向我解释我将如何使
std::random_shuffle 线程安全吗?我认为不是,因为常规的 rand() 不是线程安全的。如果是这种情况,我将如何将 rand_r 与 random_shuffle 一起使用,以便我可
我需要有关如何使用 rand_r() 生成 -1 到 1 之间的随机数的帮助。我在网上寻找如何做到这一点的示例并没有太多运气。任何帮助将不胜感激。 最佳答案 每次调用rand_r时,都会将状态变量的地
我想了解并行随机数生成的正确用法。在查阅了不同的资源后,我写了一个看起来可以工作的简单代码,但如果有人能证实我的理解,那就太好了。 为了指出rand()和rand_r()的区别和关系,我们来求解: P
以下代码使用 1 个线程比使用 2 个线程执行得更好(不过,使用 4 个线程可以提高速度): #include #include #include int main(int argc, char
我正在尝试将一些代码从 linux 移植到 cygwin 下的 windows。我发现这个奇怪的错误,其中“rand_r 未在此范围内声明”。我将 gcc 4.8.1 用作 x86_64-w64-mi
我正在创建许多线程,每个线程都应该输出一个随机数。 我知道 srand() 和 rand 不是线程安全的,事实上所有的输出数字都是相同的。 所以我尝试使用 rand_r 但我在 Windows 终端上
我是一名优秀的程序员,十分优秀!