2016-03-23 10 views
2

私はその後、私は乱数を生成するためにスクリプトでプログラムを実行すると、rand()が同じ値を返すのはなぜですか?

*pos_x = (rand() % HEIGHT); 
*pos_y = (rand() % WIDTH); 

をやって、実行の開始時にsrand(time(NULL))を持っています。私は手動で私のプログラムを実行したときにこれが正常に動作します

が、このスクリプトで、私は昼食私のプログラムを:

#!/bin/bash 

i="0" 
team_number="0" 

while [ $i -lt 30 ] 
do 
    ./lemipc `pwd` team_number 
i=$[$i+1] 
    if (($i % 10 == 0)) 
    then 
    team_number=$[$team_number+1] 
fi 
echo "create process $i" 
usleep 10000 
done 

私は常にすべてのプロセスのために同じ番号を取得します。

私はさらにこれを修正するために休憩を追加しようとしましたが、それでも動作しません。 私はexempleのためにこれを取得する:

97 51 
create process 1 
97 51 
create process 2 
97 51 
create process 3 
97 51 
97がPOS_Xで

と51 POS_Y。

なぜでしょうか?

+1

おそらく、プログラムが非常に高速に実行されるため、毎回同じ値を返す 'time'が発生するでしょうか? 'time'はUNIX時代が始まってからの経過秒数を返します。もしあなたのスクリプトが全てを1秒未満にするならば、大きなチャンスがあります。同じ値になります。 – ach

+2

問題を再現するのに必要な最小限のプログラムコード[mcve]を投稿できますか? – Angew

+0

値 'time(NULL)'を出力しないのはなぜですか?多分同じ値がすべてのプロセスに出力されます。同じシードに対して、srandは常に同じ数値シーケンスを生成します。 – Alanmars

答えて

7

time()コールの精度は秒単位でしかありません。あなたのプログラムがすべて同じ秒で実行されている場合、それらはすべて同じシードを使用します。

エントロピーを追加する必要があります。戻り値がある場合はgetpid()を使用するか、プラットフォームのランダムなソースを調査してください。

+0

ありがとう、効果的に私の眠りは十分ではなかった、私は良いランダムを持つために1秒以上寝る必要があった。 –

+3

'srand(time(NULL)^ getpid())を提案する。 – chux

+0

一般的なアプローチは、何らかの方法で時間とプロセスIDを組み合わせることです。 – paddy

2

これは、usleepが次のスクリプトの実行にマイクロ秒(10000 = 0.01秒)を遅らせるためです。 time(NULL)はSECONDSを返します。したがって、各戻り値は同じになります。time(NULL)遅延した時間を増やす

関連する問題