2017-03-19 8 views
0

スレッドを持つパックマンCゲームを開発しようとしています。 メインは2つのスレッドを作成し、そこではrand操作を実行する必要がありますが、randの結果は同じです。ここ はコードです:スレッド付きサンド - C

int main() 
{ 
    srand((unsigned)time(0)); 
    HANDLE tFantasma = CreateThread(NULL, 0, fantasma, NULL, 0, NULL); 
    srand((unsigned)time(0)); 
    HANDLE tFantasma2 = CreateThread(NULL, 0, fantasma, NULL, 0, NULL); 
    return 0; 
} 
DWORD WINAPI fantasma(LPVOID lpParam) 
{ 
    int mov = rand() % 4; 
    printf("%d",mov); 
    return 0; 
} 
+0

randを2回シードします。一度は十分でしょう。また、2つのコールの間の時間は同じになり(時間が過ぎると)、同じシードがシードされます。シーケンスが始まると、同じ番号から始まる可能性があります。 –

+0

だから、シードを一度設定しなければならないのですか? –

答えて

0

あなたが二回ランドをシード。一度は十分でしょう。また、2つのコールの間の時間は同じになり(時間が過ぎると)、同じシードがシードされます。シーケンスが始まると、同じ番号から始まる可能性があります。実行シーケンスの例として、

srand((unsigned)time(0)); 
HANDLE tFantasma = CreateThread(NULL, 0, fantasma, NULL, 0, NULL); 
--->fantasma() { 
     mov = rand() % 4; 
} 
srand((unsigned)time(0)); // reseeded; same time(); REMOVE THIS LINE 
HANDLE tFantasma2 = CreateThread(NULL, 0, fantasma, NULL, 0, NULL); 
--->fantasma() { 
     mov = rand() % 4; // sequnce restarted: same move 
} 
+0

1つのシードを削除しても機能しません。 –

+0

2回目の 'srand'呼び出しを削除します。これは 'srand(time(0))と同じように動作するはずです。 rand()%4; rand()%4; 'この一連の関数呼び出しでテストプログラムを作成し、出力を観察することができます。最後に、このシーケンスは、サイコロで6つの6を投げてもランダムであるのと同じように、最初の呼び出しで同じ番号を生成することが正式に可能である可能性があります。 –

+0

申し訳ありませんが、私はuを得ることができませんでした –

0

Windowsにはスレッドごとのメモリ領域があります。 rand()によって使用されるシードは、スレッドごとのメモリ領域に保持されるため、各スレッドにはそれ自身のシードのインスタンスがあります。各スレッドはsrand()を1回呼び出すことで、シードのインスタンスを他のスレッドとは異なる値に設定することができます。

関連する問題