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

C 为什么在脚本中运行程序时,rand()返回相同的值?,c,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

在执行开始时,我有一个
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为位置x,51为位置y

你知道为什么吗

调用
time()
仅具有整秒精度。如果您的程序都在同一秒运行,它们将使用相同的种子


你必须增加更多的熵。考虑使用返回值,如果你有它,或者调查平台的随机来源。

< P>这是原因:代码> USELIP延迟下一个脚本的执行,微秒的数量(10000=0.01秒)。代码>时间(NULL)返回秒,从而使每个
时间(NULL)
返回值相同。增加延迟的时间量

可能是程序执行得太快,从而导致
time
每次返回相同的值
time
返回自UNIX时代开始以来经过的秒数,因此,如果您的脚本将所有时间缩短到不到一秒,则很有可能是相同的值。您是否可以发布a-重现问题所需的最小程序代码?为什么不输出值“time(NULL)”?可能所有进程都输出相同的值,你知道,对于相同的种子,srand总是生成相同的数字序列。感谢,实际上我的usleep还不够,我需要睡眠超过1秒才能获得良好的随机性。建议
srand(time(NULL)^getpid())
一种常见的方法是以某种方式组合时间和进程ID。