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

use*_*878 19 c++ compiler-warnings

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

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

using namespace std;

int main () {

srand( time(NULL) );
cout << rand();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何帮助,将不胜感激!

Bri*_*ain 32

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

您隐式丢失精度因为time()返回的long值大于unsigned int目标上的精度.为了解决这个问题,你应该显式地转换结果(从而删除"隐式精度损失"):

srand( static_cast<unsigned int>(time(nullptr))); 
Run Code Online (Sandbox Code Playgroud)

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

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

#include <chrono>

void f() {
    const std::chrono::time_point current_time = std::chrono::system_clock::now();
}
Run Code Online (Sandbox Code Playgroud)

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

IMO,只有一个原因就足够了:清晰,明确的类型.当你在足够大的团队中处理大型程序时,知道传递的值是代表时间间隔还是"绝对"时间,以及什么量级是关键的.有了std::chrono你可以设计出便携式接口和数据结构,并跳过了的是,这超时-A-期限或-毫秒-从-现在-或-等待-是-它秒蓝调.

  • 由于这个问题被标记为C++:_Please_不使用C风格的强制转换.`srand(static_cast <unsigned int>(time(NULL));`同样有效,使你的代码看起来很漂亮和闪亮.作为奖励,它避免了大量潜在的错误,可以在C风格的演员阵容中蔓延. .. (5认同)
  • 确实,我不看标签就粗心地以为这是一道C题。答案已被编辑以纠正问题。 (2认同)
  • 它可能使用了不同的目标,其中“long”和“unsigned int”之间没有精度损失(另一个编译器适用于 32 位机器,而这个编译器可能是 64 位机器?) (2认同)
  • 我推荐代码 `std::random_device rd;`~ `std::mt19937 mt(rd());`~ `std::uniform_real_distribution&lt;double&gt; ddist(0, 1);`~ 然后使用 `ddist(mt) ;` 在 C++ 中获取随机数。就我而言,我使用 c++11。 (2认同)

reu*_*ohn 14

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

更深入的解释:

srand()需要一个unsigned int作为参数(srand(unsigned int))但是time()返回一个long int(long int time())并且srand()不接受这个,所以为了解决这个问题,编译器必须简单地强制转换(转换)" long int"to"unsigned int".

但在你的情况下,编译器会警告你(因为编译器的设计者认为你应该知道这一切).

这么简单

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

会做的!

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


nio*_*nio 5

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

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

srand( (unsigned int) time(NULL) );
Run Code Online (Sandbox Code Playgroud)

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