在函数中使用 srand()

Using srand() within a function

我正在学习如何在 C 中使用 "rand()" 和 "srand()"。在我正在阅读的书中,它要求修改生成随机数的程序,以便用户提供种子.这确保了数字是随机的。我可以直接使用下面的基本代码生成新数字,但是当我尝试在它下面的程序中使用它时它不会工作。

int main() 
{
    int seed;

    srand(seed);

    printf("Please enter a seed: ");
    scanf("%d", &seed);

    printf("The random number is: %d\n", rand());

    return (EXIT_SUCCESS);
}

这是我在获取 "srand() to work in below. I have tried asking the user for the seed in "main" 时遇到问题的程序,而不是 prn_random_numbers 函数和我能想到的所有其他功能。它仍然只表现得像 "rand()" 和无论我输入的种子是什么,都吐出相同的数字。我做错了什么?不幸的是,这本书没有给出任何练习的答案。我非常感谢任何帮助。我只是在自学。

max(x, y)
int x, y;
{
    if (x > y)
        return (x);
    else
        return (y);
}

min(x, y)
int x, y;
{
   if (x < y)
       return (x);
   else
       return (y);  
}

prn_random_numbers(k)   /* print k random numbers */
int k;
{
    int i, r, smallest, biggest;
    int seed;

    srand(seed);
    printf("Please enter a seed: ");
    scanf("%d", &seed);

    r = smallest = biggest = rand();
     printf("\n%12d", r);
    for (i = 1; i < k; ++i)
    {
        if (i % 5 == 0)
            printf("\n");
        r = rand();
        smallest = min(r, smallest);
        biggest = max(r, biggest);
        printf("%12d", r); 
    }
    printf("\n\n%d random numbers printed.\n", k);
    printf("Minimum:%12d\nMaximum:%12d\n", smallest, biggest);
}

int main() 
{
    int n;

    printf("Some random numbers are to be printed.\n");
    printf("How many would you like to see? ");
    scanf("%d", &n);
    while (n < 1)
    {
        printf("ERROR! Please enter a positive integer.\n");
        printf("How many would you like to see? ");
        scanf("%d", &n);
    }        
    prn_random_numbers(n);

    return (EXIT_SUCCESS);
}

第 1 部分

在第一个代码块中,您使用未初始化的变量调用 srand() — 这不好。您需要在从用户那里读取种子之后移动该调用。您还应该检查输入的结果是否有效。

int main(void) 
{
    int seed;

    printf("Please enter a seed: ");
    if (scanf("%d", &seed) != 1)
    {
        fprintf(stderr, "Failed to read seed - exiting\n");
        return EXIT_FAILURE;
    }
    srand(seed);

第 2 部分

在第二个代码块中,您正在编写 K&R 风格的函数定义。

不要!!!

是的,如果可以的话,我会大声喊叫。如果你的教科书教你这种风格,把这本书扔进垃圾桶,再拿另一本书。在新代码中使用 K&R 风格的定义,你必须有一个特别的理由。原型已经通过标准编译器提供了大约 30 年,并且已经普遍可用了 20 年。

您在第二个示例中调用 srand() 的代码也存在与第一个示例相同的缺陷 — 在从用户那里获得种子之前调用该函数。

此外,每次程序 运行 时用户提供不同种子的机会几乎为零。你声称它 "ensures the numbers are random" 是一个非常乐观的观点。