这种随机化的实现如何在C中起作用?

问题描述 投票:0回答:1

由于我在https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm上找到了这个特殊的文档,我一直在考虑这个特殊的代码行srand((unsigned)time(&t));。每当我必须生成一些东西时,我使用srand(time(NULL))以便每次运行程序时都不会生成相同的东西,但是当我来到在这一点上,我一直在想:srand((unsigned)time(&t))srand(time(NULL))之间有什么区别吗?因为对我来说他们似乎也做同样的事情。为什么使用time_t变量?为什么在srand()中使用地址运算符?

#include <stdio.h>
#include<stdlib.h>
int main(){
int i,n;
time_t t;

n = 5;


srand((unsigned)time(&t)); 


for (i = 0; i < n; i++) {
    printf("%d\n", rand() % 50);
}
return(0);
}
c srand
1个回答
4
投票

是的,它会产生相同的结果。但是这个例子写的很糟糕。

我会小心阅读Tutorialspoint。这是一个以糟糕的C代码着称的网站,你在SO的问题中看到的许多坏习惯都可以追溯到该网站。好吧,这是轶事证据,但我确实向用户询问他们为什么投出malloc的结果,他们回答说他们在Tutorialspoint上学到了这一点。您可以在这个简短的片段中看到(至少)四个示例。

  1. 他们将调用的结果转换为time(),这完全没有必要,只会使代码混乱。
  2. 由于某种原因,他们使用变量t,这在这个例子中完全没用。如果你阅读time()的文档,你会发现在这个例子中只传递NULL就足够了。
  3. 为什么要使用变量n?对于这个简短的例子,硬编码值完全没问题。当你使用变量来避免硬编码值时,你应该声明它们const并给它们一个比n更具描述性的名称。
  4. 省略#include<time.h>,如果他们也省略了其余的包括,那就没问题了。

人们也可以争论另外两件事,但有些人会对这些事情持不同意见。

  1. 为什么在for循环之外声明i?自从C99开始宣布它是合法的,这是20年。
  2. 为什么用return 0结束这个功能?从C99开始,省略这一点也没问题。如果你想返回0以外的东西,你只需要在main中返回一个。

如果您的目标是在没有支持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)。如果您不使用变量,则没有理由使用第二个签名。

© www.soinside.com 2019 - 2024. All rights reserved.