2011-12-29 7 views
1

私は各スレッドが使用する乱数を生成しようとしていますが、すべてのスレッドは同じ数を生成します。スレッドは同じ乱数を生成しますか?

プログラムを毎回実行すると番号が変わりますが、すべてのスレッドが特定の実行で同じ番号を生成します。

スレッドごとに異なる乱数を生成するにはどうすればよいですか?スレッドが同じ秒で乱数を生成した場合、時間とともに乱数ジェネレータのシード

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

スレッドに種を入れないでください。 – Dave

+0

複数のスレッドtime()で同じ値を与える可能性があります.sveyスレッド同じ値の初期乱数ジェネレータ... –

+0

生成時のシード時間==全くランダムではありません – bestsss

答えて

4

randは、スレッドと関連して疑似ランダム生成に使用しないでください。この関数は、すべてのスレッドに共通の共有状態を使用します。これは、スレッドによって描画されるPRN間の依存関係を生成し、状態へのアクセスがミックスされなければならないため、実質的に遅くなります。

POSIXシステムの代わりに、(スレッド固有の)状態を引数として受け取るnrand48jrand48があります。他の人が言っているように、時間価値だけでその状態を播種することは良い考えではありませんが、スレッドは同じ瞬間にそれを行うことがあります。

4

はあなたに同じ乱数を与えます。あなたは時間だけでなく、スレッド番号やそのような何かを播種することができます。

Daveが示唆しているように、あなたはスレッドの外に一度シードできます。

関連する問題