我在执行开始时有一个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。
知道为什么吗?
答案 0 :(得分:7)
time()
调用只有全秒精度。如果你的程序都运行相同的秒,它们都将使用相同的种子。
您必须添加更多熵。如果有的话,请考虑使用getpid()
的返回值,或者调查平台的随机来源。
答案 1 :(得分:2)
这是因为"fields": ["name", "season"]
延迟执行下一个脚本的微秒量(10000 = 0.01秒)。 usleep
返回SECONDS,从而使每个time(NULL)
返回值相同。增加延迟的时间