srand(time(null))导致编译器警告:隐式转换失去整数精度

时间:2013-07-12 15:15:33

标签: c++ compiler-warnings

如果这个问题已经得到解答,请道歉。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main () {

srand( time(NULL) );
cout << rand();
}

“隐式转换失去整数精度:'time_t'(又名'long')到'unsigned int'”

当我执行上面的代码时,是否收到错误消息。我正在使用xcode 4.6.1。现在,当我使用不同的编译器,例如来自codepad.org的编译器时,它执行完全正常生成看起来像随机数,所以我假设它是一个我需要解决的xcode问题?

我已经开始编程了所以我是一个完整的初学者。我的代码有问题还是我的编译器?

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:30)

  

“隐式转换失去整数精度:'time_t'(又名'long')到'unsigned int'”

由于time()返回的long大于目标上的unsigned int,因此隐式失去了精度。为了解决此问题,您应该显式地转换结果(从而删除“隐式精度损失”):

srand( static_cast<unsigned int>(time(NULL)));

鉴于它现在是2017年,我正在编辑此问题,建议您考虑std::chrono::*中定义的<chrono>提供的功能作为C ++ 11的一部分。您最喜欢的编译器是否提供C ++ 11?如果没有,它真的应该!

要获得当前时间,您应该使用:

#include <chrono>

void f() {
    const std::chrono::time_point current_time = std::chrono::system_clock::now();
}

time()工作时为什么要烦恼?

IMO,只有一个原因就足够了:明确的,明确的类型。当你在足够大的团队中处理大型程序时,知道传递的值是代表时间间隔还是“绝对”时间,以及什么量级是关键的。使用std::chrono,您可以设计可移植的接口和数据结构,并跳过is-that-timeout-a-deadline-or-milliseconds-from-now-or-wait-was-it-seconds blues。

答案 1 :(得分:14)

正如“nio”所提到的,一个干净的解决方法是显式地输入强制转换。

更深入的解释:

srand()需要unsigned int作为参数(srand(unsigned int))但time()返回一个long int(long int time())并且srand()不接受这个,所以为了修复这样,编译器必须简单地将“long int”强制转换(转换)为“unsigned int”。

但是在你的情况下,编译器会警告你(正如编译器的设计者认为你应该知道的那样)。

这么简单

srand( (unsigned int) time(NULL) );

会做到这一点!

(请原谅我,如果我做错了,这是我在stackoverflow上的第一个答案)

答案 2 :(得分:5)

srand函数将unsigned int作为参数类型,time_t是long类型。剥离了长4个字节,但没有问题。 srand会将rand算法随机化为4个较低的字节时间,因此您提供的数据量超出了所需的数量。

如果出现错误,请尝试将time_t类型显式转换为unsigned int:

srand( (unsigned int) time(NULL) );

另一个有趣的事情是,如果你在同一秒内运行你的程序两次,你会得到相同的随机数,这有时是不受欢迎的,这是因为如果你使用相同的数据为rand算法设定种子,它将生成相同的随机序列。或者,当您调试某些代码并需要再次测试相同的行为时,可能需要...然后您只需使用类似srand(123456)

的内容

答案 3 :(得分:2)

这是错误。代码有效,其含义明确;如果编译器拒绝编译它,编译器就不符合语言定义。更可能的是,这是一个警告,它告诉你编译器编写者认为你可能犯了一个错误。如果您坚持消除警告消息,您可以添加演员阵容,正如其他人所建议的那样。我不是重写有效,有意义的代码以满足一些编译器作者的好风格概念的忠实粉丝;我会关掉警告。但是,如果你这样做,你可能会忽略转换丢失你不想要的数据的其他地方。

答案 4 :(得分:0)

#include <stdlib.h>
#include <iostream>         //rand
#include <time.h>       //time

float randomizer(int VarMin, int VarMax){
    srand((unsigned)time(NULL));
        int range = (VarMax - VarMin);
        float rnd = VarMin + float(range*(rand()/(RAND_MAX + 1.0)));
return rnd;
}