用C语言运行rand()并使用Shell Scripts循环
我有一个C代码文件(调用“ test.c ”,输出是“ test.out ”),如下所示,只是一个简单的随机数输出:
int main() { srand(time(NULL)); double r = (double)rand() / (double)RAND_MAX; printf("%f\n", r); return 0; }
现在我使用shell脚本在Linux中运行“ test.out ”5次,代码如下:
for i in 1 2 3 4 5 do test.out done
但结果如下所示
0.840188 0.840188 0.840188 0.840188 0.840188
它显示相同的随机数。
使用当前时间初始化伪随机生成器。 在大多数平台上, time
函数以秒为单位返回当前时间。 如果您在一秒钟内多次运行此程序,那么您将在所有执行中设置相同的种子,并获得相同的“随机”数字。
在脚本的循环中添加例如sleep 1
,您将看到不同的结果。
rand()
将为同一个种子 (使用srand()
设置的种子生成相同的数字序列)。
很可能你的循环运行得太快而且你的所有运行最终都使用相同的种子 (即time(NULL)
返回相同的值)。 因此,您会看到相同的输出。
您可以使用drand48()
来生成均匀分布的数字。 或者,如果您只是想测试rand()
,则可以在迭代之间添加延迟。
for i in 1 2 3 4 5 do test.out done
您在同一秒内执行该程序5次,并且由于您使用系统时间(以秒为单位)作为rand()
函数的种子,因此您将获得相同的结果。 如果您在执行之间等待一秒钟(或更长时间),您将获得不同的值。