为什么rand()在脚本中运行程序时会返回相同的值?

时间:2016-03-23 14:07:32

标签: c

我在执行开始时有一个srand(time(NULL)),然后我正在做

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

生成随机数。

当我手动运行程序时,这可以正常工作,但是当我用这个脚本在我的程序中休息时:

#!/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

我总是为所有流程获得相同的数字。

我甚至试图添加一个usleep来解决这个问题,但它仍然无效。 我得到这个例子:

97 51 
create process 1
97 51 
create process 2
97 51 
create process 3
97 51 

其中97是pos_x和51 pos_y。

知道为什么吗?

2 个答案:

答案 0 :(得分:7)

time()调用只有全秒精度。如果你的程序都运行相同的秒,它们都将使用相同的种子。

您必须添加更多熵。如果有的话,请考虑使用getpid()的返回值,或者调查平台的随机来源。

答案 1 :(得分:2)

这是因为"fields": ["name", "season"]延迟执行下一个脚本的微秒量(10000 = 0.01秒)。 usleep返回SECONDS,从而使每个time(NULL)返回值相同。增加延迟的时间