线程产生相同的随机数?

时间:2011-12-29 14:40:17

标签: c multithreading random pthreads

我正在尝试为每个要使用的线程生成随机数,但所有线程都生成相同的数字。

每次运行程序时,数字会发生变化,但所有线程都会为给定的运行生成相同的数字。

我应该怎样做才能为每个线程生成不同的随机数?

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);
}

2 个答案:

答案 0 :(得分:5)

如果线程在同一秒产生随机数,那么随着时间播种随机数生成器会给你相同的随机数。你可以用时间加上线程号或类似的东西来播种。

或者,正如Dave建议的那样,你可以在线程之外播种一次。

答案 1 :(得分:4)

您不应将rand用于与线程相关的伪随机生成。此函数使用所有线程共有的共享状态。这会在线程绘制的PRN之间产生依赖关系,并且因为访问状态必须是互斥的,所以会大幅减慢。

POSIX系统上的替代方案是nrand48jrand48接收状态(应该是特定于线程的)作为其参数。正如其他人所说,只使用时间值播种该状态并不是一个好主意,线程可能会在同一时刻执行此操作。