在c中的srand函数中,'time(null)'之前是否需要'(unsigned int)'?

时间:2014-04-16 12:43:46

标签: c random srand

我看过一些关于使用C生成随机数的指南: 有两件事让我感到疑惑:

  1. 据说除了stdlib.h和time.h库之外我还要包含math.h库才能工作,为什么? (afrand的srand和rand函数在stdlib中)?
  2. 在示例中,srand函数按以下方式编写:

    srand((unsingned int)time(NULL);
    
  3. 我正在使用代码块,并且它在没有unsigned int和数学库的情况下正常工作,那么为什么它们会在示例中包含它?

    谢谢!

3 个答案:

答案 0 :(得分:3)

函数time返回time_t值,而srand期望unsigned int参数。如果没有强制转换,编译器可能会产生警告,并且根据编译器标志,这可能导致编译失败。一般来说,避免警告是一种好习惯。

您显示的行中没有任何内容需要包含math.h。可能这个评论指的是代码的其他部分?

答案 1 :(得分:3)

  

我需要'(unsigned int)'在' time(null)'之前在c?

中的srand函数中

time()返回time_t类型的变量。在编译器上对应的类型大小是实现定义的。您必须检查编译器文档。

  

据说除了stdlib.h和time.h库之外我还要包含math.h库才能工作,为什么呢?

对于发布的行,不需要math.h。很可能它是代码的其他部分所需要的。

答案 2 :(得分:0)

您不需要包含数学库。

该示例大部分时间都有效,但在技术上不正确,因为转换为不兼容的类型无效。

唯一正确的方法是散列变量time_t的字节。

time_t t = time( NULL ) ;
char* p = ( char* )&t ; 
unsigned int hash = 0 ;

for( int i = 0 ; i < sizeof( time_t ) ; i++ )  
    hash += p[i] ;

然后在srand()函数中使用hash。

您可以转换为char *然后使用指针。 哈希函数非常简单,您可能希望选择更好的哈希函数。