【问题标题】:Do I need '(unsigned int)' before 'time(null)' in the srand function in c?在c中的srand函数中的'time(null)'之前是否需要'(unsigned int)'?
【发布时间】:2014-05-31 08:22:36
【问题描述】:

我看过一些使用 C 生成随机数的指南: 有两件事让我想知道:

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

    srand((unsingned int)time(NULL);
    

我正在使用代码块,它在没有 unsigned int 和数学库的情况下也能正常工作,那么为什么他们将它包含在示例中?

谢谢!

【问题讨论】:

  • 你能提供指南的链接吗?
  • 你试过了吗?如果省略math.h,编译器会返回什么错误(如果有)?它可能会给你一些线索。另外,看看time() 返回的类型,以及srand() 期望的类型。
  • time_t的类型是整数还是浮点数?

标签: c random srand


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您不需要包含数学库。

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

    唯一正确的方法是对变量 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() 函数中使用哈希。

    您可以转换为 char* 然后使用指针。 哈希函数很简单,你可能想选择一个更好的。

    【讨论】:

      【解决方案3】:

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

      您显示的行中的任何内容都不需要包含math.h。可能这个注释是指代码的其他部分?

      【讨论】:

      • +1 用于解释类型更改和避免警告的良好做法。如今,time_t 的范围通常比 unsigned 更大。
      • 谢谢!由于假期,我花了一些时间回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2020-07-25
      相关资源
      最近更新 更多