2017-04-01 30 views
0

有人问我要不要使用rand()因为他们不是“线程安全”,并每次也使用不同的种子值。我使用这样的种子值发现在GitHub例子:如何使用rand_r()在C中创建线程安全的随机数生成器?

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; 
} 
+1

由于有这么多类似的问题 - 唯一的种子** **一次。 –

+0

Huh ..odd。为什么播种多次导致数字完全相同? – btramisetty

+2

因为'rand_r'是带一个参数确定性函数 - seed'的'值。 –

回答

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; 
} 
相关问题