这种随机化实现如何在C中工作?

时间:2019-04-17 15:47:27

标签: c srand

自从我在 https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm 上找到此特定文档以来,我一直在思考这一特定的代码行<table class="table table-striped"> <tr> <th>One</th> <th>Two</th> </tr> <tr> <td>This is 1st</td> <td>This is 2nd</td> </tr> </table> 。每当我不得不生成一些东西时,我都会使用{ {1}}是为了不每次运行程序时都生成相同的内容,但是当我遇到这个问题时,我一直在想:srand((unsigned)time(&t));srand(time(NULL))之间是否有区别?是因为我它们似乎好像在做同样的事情。为什么要使用time_t变量?为什么在srand((unsigned)time(&t))中使用了地址运算符?

srand(time(NULL))

1 个答案:

答案 0 :(得分:4)

是的,它将产生相同的结果。但是这个例子写得不好。

我会仔细阅读Tutorialspoint。这是一个以不良C代码而闻名的网站,您在SO的问题中看到的许多不良习惯都可以追溯到该网站。好的,这是轶事证据,但我确实在这里问了一个用户,为什么他们强制转换malloc的结果,他们回答说,他们已经在Tutorialspoint上学到了这一点。实际上,您可以在这个简短的代码片段中看到(至少)四个示例。

  1. 他们将调用的结果强制转换为time(),这完全没有必要,只会使代码混乱。
  2. 由于某些原因,他们使用了变量t,在此示例中这完全没有用。如果您阅读time()的文档,您会发现在此示例中仅传递NULL就足够了。
  3. 为什么要使用变量n?对于这个简短的示例,使用硬编码值完全可以。而且,当您使用变量来避免使用硬编码的值时,应声明它们const,并为它们提供比n更具描述性的名称。
  4. 省略了#include<time.h>,如果他们也省略了其余的包含内容,那没关系。

一个人可能还会争论另外两件事,但是有些人会不同意。

  1. 为什么要在for循环之外声明i?自20岁的C99以来,在内部声明它是合法的。
  2. 为什么用return 0结束函数?从C99开始,也可以省略此设置。如果要返回0以外的其他值,则只需要在main中有一个return即可。

如果您的目标是在没有支持C99的编译器的环境中维护非常老的C代码,则上述两种方法都应该很好地记住。但这有多普遍?

因此,如果我必须在tutorialspoint上重写示例,则可以这样编写:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
    srand(time(NULL)); 

    for (int i = 0; i < 5; i++) {
        printf("%d\n", rand() % 50);
    }
}

他们擅长的一件事是他们使用int main()而不是int main(int argc, char **argv)。如果您不使用变量,则没有理由使用第二个签名。