我正在编写一个程序,其中有工作线程创建随机数 从0到3 从0到x-1(变量)
我需要学习的是如何在C中生成这些随机数。
我正在使用gcc编译器并在Ubuntu 11.10上工作
答案 0 :(得分:7)
rand()
&在这种情况下,srand()
不是可以安全使用的。
他们都既不是重入也不是线程安全。一般来说,C或C ++标准都没有对任何标准库函数的线程安全性提出任何要求 某些实现可能确实提供了线程安全版本,但标准并未强制要求。
在多线程环境中能够使用随机数生成器您需要一个允许传入状态的实现。这样,您可以为每个线程保留一个状态值,并生成高质量的随机数,而无需同步。
C标准库不提供任何选择。这使得100%的可移植性变得相当不可能。使用的选择将取决于你的环境,你应该提到它作为问题的一部分,以获得准确的答案。
查看声称提供 GNU Scientific Library 的 MultiThreaded Random Number generator 。
答案 1 :(得分:1)
使用rand_r()
(请参阅rand(3))
函数rand_r()提供了一个指向unsigned int的指针, 被用作国家。
它是可重入的并且将种子作为输入,因此线程可以单独管理它们的种子。
答案 2 :(得分:1)
如果您只是想要一些随机数并且不关心是否独立生成随机数序列号,您仍然可以使用rand()
和srand()
。
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* cb1(void*) {
while(1) {
printf("cb1, rand:%d\n",rand());
sleep(1);
}
}
void* cb2(void*) {
while(1) {
printf("cb2, rand:%d\n",rand());
sleep(1);
}
}
int main() {
pthread_t th1, th2;
srand(1);
pthread_create(&th1, NULL, cb1, NULL);
pthread_create(&th2, NULL, cb2, NULL);
pthread_join(th1, NULL);
pthread_join(th2, NULL);
return 0;
}
答案 3 :(得分:0)
真理和美丽的事物;
http://en.wikipedia.org/wiki/Mersenne_twister
编写自己的RNG。
(道歉。我刚看了那个维基页面。最后我看了一会儿,很好;你可以读它并实现扭转。现在它是一堆学位水平的数学,它绝对没有解释任何人,除非在大学学习数学学习四年的人口。我在维基上看到这种情况发生了很多: - (
答案 4 :(得分:0)
使用C11 threads.h
的简单版本,缺少错误检查,如下所示:
mtx_t rand_mtx;
//run only once.
int rand_init(int seed)
{
srand(seed);
mtx_init(&rand_mtx, mtx_plain);
}
int synced_rand()
{
mtx_lock(&rand_mtx);
int r = rand();
mtx_unlock(&rand_mtx);
return r;
}