我正在尝试为每个要使用的线程生成随机数,但所有线程都生成相同的数字。
每次运行程序时,数字会发生变化,但所有线程都会为给定的运行生成相同的数字。
我应该怎样做才能为每个线程生成不同的随机数?
void *Customer(void *customer_id)
{
unsigned int iseed = (unsigned int)time(NULL);
srand (iseed);
int rastgele = rand() % 3 + 1;
int *id_ptr,customer_idd;
id_ptr=(int *) customer_id;
customer_idd=*id_ptr;
printf("This is thread : %d %d \n",customer_idd,rastgele);
pthread_exit(NULL);
}
答案 0 :(得分:5)
如果线程在同一秒产生随机数,那么随着时间播种随机数生成器会给你相同的随机数。你可以用时间加上线程号或类似的东西来播种。
或者,正如Dave建议的那样,你可以在线程之外播种一次。
答案 1 :(得分:4)
您不应将rand
用于与线程相关的伪随机生成。此函数使用所有线程共有的共享状态。这会在线程绘制的PRN之间产生依赖关系,并且因为访问状态必须是互斥的,所以会大幅减慢。
POSIX系统上的替代方案是nrand48
和jrand48
接收状态(应该是特定于线程的)作为其参数。正如其他人所说,只使用时间值播种该状态并不是一个好主意,线程可能会在同一时刻执行此操作。