当我多次运行我的程序(在C中)时,它总是选择相同的随机数

时间:2015-02-19 15:53:23

标签: c

所以我的程序实际上是一个DPLL SAT求解器,因此在程序内部需要选择随机变量来赋值为TRUE或FALSE。如果我运行我曾经的程序它运行正常!如果再次运行它将选择不同的变量仍然有效(这是我想要的)。

然而,为了产生可靠的实验,我需要重复运行我的程序。这可以通过分别多次运行程序来完成,但这很繁琐并且需要很长时间。我已经学会了如何使用bash如下:

#!/bin/bash 

for ((i=50; i>0; i--))  
do  
./Project 90 10 >> outfile.txt 
done

然而,当这样做时,每次运行都以相同的顺序选择相同的“随机”变量,因此产生相同的结果。如何让我的程序每次都以不同的方式运行?

谢谢!

1 个答案:

答案 0 :(得分:5)

您需要初始化随机数种子,随机数不是真正随机的,将其添加到您的main()

#include <time.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    srand(time(NULL)); /* here at the very beginnig of main */
    .
    .
    .
    return 0;
}

每次执行程序时都会给出不同的种子,因为time(NULL)将返回不同的值。

阅读this了解详情。

注意:由Ingo Leonhardt评论效果相同,请尝试此选项

#include <stdlib.h>
#include <sys/time.h>

int main(int argc, char **argv)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);

    srand(tv.tv_usec); /* here at the very beginnig of main */
    .
    .
    .
    return 0;
}

或者,由于每个流程都有不同的pid,这也可以起作用 1

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    srand((int)getpid()); /* here at the very beginnig of main */
    .
    .
    .
    return 0;
}

1 这是一个POSIX解决方案,如果你想要你可以研究你的操作系统等价物,如果它不支持POSIX。