当我使用time(NULL)种子生成器时,为什么会收到可能丢失数据的警告?(涉及IT技术)

5

我正在学习向量,并编写了一些代码,可以选择随机数字用于在荷兰购买彩票。但是虽然它可以运行,编译器却警告我“从'time_t'到'unsigned int'的转换,可能会丢失数据”。

有人能发现是什么原因引起的吗?在这段代码中,我甚至没有定义任何无符号整数;据我所知,默认情况下int i是有符号整数。感谢您的见解。

#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

void print_numbers();
string print_color();

int main() {
srand(time(NULL));
print_numbers();
string color = print_color();
cout << color << endl;

system("PAUSE");
return 0;
}

//Fill vector with 6 random integers. 
//
void print_numbers() {
vector<int> lucky_num;

for (int i = 0; i < 6; i++) {
    lucky_num.push_back(1 + rand() % 45);
    cout << lucky_num.at(i) << endl;
}
}

//Select random color from array.
//
string print_color() {
string colors[6] = {"red", "orange", "yellow", "blue", "green", "purple"};
int i = rand()%6;
return colors[i];
}

确切的编译器信息:警告 C4244: 'argument': 从 'time_t' 转换为 'unsigned int',可能会丢失数据。第11行。

当我们不知道确切的编译器消息和代码行时,猜测真的很令人兴奋。然而,荷兰彩票的信息确实有所帮助 :) - Alex F
警告信息会给出一行代码,你应该在帖子中提到这个重要信息(最好是完整的警告信息)。 - Roman R.
警告将出现在“srand(time(NULL));”这一行,这是唯一涉及时间的行。将来,行号确实会有所帮助。 - RvdK
1
有人知道荷兰彩票抽奖中使用的随机数种子吗?这会对我非常有帮助 :) - Brett Hale
5个回答

8
因为在您特定的平台上,time_t 的大小比 unsigned int 大,所以会收到此类警告。将“更大”的类型强制转换为“更小”的类型涉及到截断和数据丢失,但在您的这种情况下,这并不太重要,因为您只是在初始化随机数生成器并将 unsigned int 溢出应该发生在未来很久的日期。
显式地将其转换为 unsigned int 可以抑制警告:
srand((unsigned int) time(NULL));

1

time_t 在许多平台上是一个64位的值,以防止纪元时间最终包装,而 unsigned int 是32位的。

在您的情况下,您不需要关心,因为您只是种子随机数生成器。但在其他代码中,如果您的软件曾经涉及日期past 2038,当您将其转换为32位值时,您的time_t可能会被截断为32位的2038年之前的日期。


0
void srand ( unsigned int seed );
time_t time ( time_t * timer );
typedef long int __time_t;

long int和unsigned int不同,因此会出现警告。

(来自stackoverflow)


0

time 返回一个 time_t 对象。

srand 需要一个无符号整数。


0
srand(time(NULL));

如果time函数返回的值超过了无符号整型的表示范围,那么该行代码可能会溢出。这种情况是有可能发生的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接