Потоки выдают одно и то же случайное число? - PullRequest
2 голосов
/ 29 декабря 2011

Я пытаюсь создать случайные числа для каждого используемого потока, но все потоки выдают одно и то же число.

Число изменяется при каждом запуске моей программы, но все потоки выдают одно и то же числодля данного прогона.

Что я должен сделать, чтобы получить разные случайные числа для каждого потока?

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 ]

5 голосов
/ 29 декабря 2011

Заполнение генератора случайных чисел временем даст вам то же самое случайное число, если потоки производят случайное число в одну и ту же секунду.Вы могли бы просто посеять время плюс номер потока или что-то в этом роде.

Или, как предположил Дэйв, вы могли бы просто посеять один раз вне потока.

4 голосов
/ 29 декабря 2011

Не следует использовать rand для генерации псевдослучайных данных в связи с потоками.Эта функция использует общее состояние, общее для всех потоков.Это создает зависимости между PRN, нарисованным потоками, и существенно замедляется, так как доступ к состоянию должен быть взаимно изменен.

Альтернативами в системах POSIX будут nrand48 и jrand48, которые получают состояние (которое должнобыть конкретным потоком) в качестве аргумента.Как говорили другие, заполнение этого состояния только значением времени не очень хорошая идея, потоки могут сделать это в одно и то же время.

...