如果这个问题已经得到解答,请道歉。
#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问题?
我已经开始编程了所以我是一个完整的初学者。我的代码有问题还是我的编译器?
任何帮助将不胜感激!
答案 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;
}