22

如果这个问题已经得到回答,我们深表歉意。

#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 问题?

我刚刚开始编程,所以在这方面我是一个完整的初学者。我的代码有问题还是我的编译器有问题?

任何帮助,将不胜感激!

4

5 回答 5

34

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

您正在隐式丢失精度,因为time()返回的 along大于unsigned int目标上的 a 。为了解决这个问题,您应该明确地转换结果(从而消除“隐式精度损失”):

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

鉴于现在是 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 蓝调。

于 2013-07-12T15:23:45.060 回答
16

正如“nio”所提到的,一个干净的解决方法是显式类型转换。

更深层次的解释:

srand() 需要一个 unsigned int 作为参数 ( srand(unsigned int)) 但 time() 返回一个 long int ( long int time()) 并且 srand() 不接受这一点,因此为了解决这个问题,编译器必须简单地进行类型转换(转换)“ long int”到“unsigned int”。

但是在您的情况下,编译器会警告您(因为编译器的设计者认为您应该知道仅此而已)。

所以一个简单的

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

会成功的!

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

于 2013-07-12T17:57:55.220 回答
5

srand 函数有 unsigned int 作为参数类型,time_t 是 long 类型。long 的前 4 个字节被去掉了,但没有问题。srand 将随机化 rand 算法,时间减少 4 个字节,因此您提供的数据比需要的多。

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

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

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

于 2013-07-12T15:21:33.327 回答
2

不是错误。代码有效,含义明确;如果编译器拒绝编译它,则编译器不符合语言定义。更有可能的是,它是一个警告,它告诉您编译器编写者认为您可能犯了一个错误。如果您坚持消除警告消息,则可以像其他人建议的那样添加演员表。我不喜欢重写有效的、有意义的代码以满足一些编译器编写者的良好风格概念;我会关闭警告。但是,如果您这样做,您可能会忽略转换丢失您不希望的数据的其他地方。

于 2013-07-12T16:20:03.317 回答
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;
}
于 2013-11-21T19:20:13.623 回答