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-期限或-毫秒-从-现在-或-等待-是-它秒蓝调.
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上的第一个答案)
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)
归档时间: |
|
查看次数: |
30591 次 |
最近记录: |