C++ 使用srand转换的警告

C++ 使用srand转换的警告,c++,C++,我有int r\u number=0作为全局变量 在下面的代码中: srand(time(0)); r_number = rand() % 1000 + 701; 它不断地发出以下警告: 1>: warning C4244: 'argument': conversion from 'time_t' to 'unsigned int', possible loss of data 转换中有什么错误?VC++4级警告消息意味着时间的类型比无符号int大-可能

我有
int r\u number=0作为全局变量

在下面的代码中:

        srand(time(0));
        r_number = rand() % 1000 + 701;
它不断地发出以下警告:

1>: warning C4244: 'argument': conversion from 'time_t' to 'unsigned int', possible loss of data

转换中有什么错误?

VC++4级警告消息意味着
时间
的类型比
无符号int
大-可能是64位,因此需要将
时间()
返回的值截断为32位,以传递给
srand()
。在这种特定情况下,这并不重要,但在其他地方可能会有问题(考虑将文件大小处理为
unsigned int
,只是为了发现程序崩溃时文件大小>=4 GB)

要使警告静音,请使用显式强制转换,告诉编译器您知道自己在做什么:

srand((unsigned)time(nullptr));

话虽如此,使用它是因为它不精确(除其他外)。
rand()
返回的值均匀分布在0和
rand_MAX
之间,但是
rand_MAX
+1通常不会被
X
平均分割,这将导致
rand()%X
的偏差分布

C++自带了自己的随机数实现,在许多方面都更好:

#include <iostream>
#include <random>

int main() {
    std::random_device rd;                           // better than time()
    std::mt19937_64 gen(rd());                       // better than rand()
    std::uniform_int_distribution<> dist(701, 1701); // better than % 1000 + 701
    std::cout << dist(gen) << std::endl;
}
#包括
#包括
int main(){
std::random_device rd;//比时间更好()
std::mt19937_64 gen(rd());//比rand()好
标准::统一分布区(7011701);//优于%1000+701

STD::CUT不使用C的随机库。使用C++随机库。请参阅,看为什么你可以添加一个演员来沉默这个警告:<代码> SRAND((无符号int)时间(0));<代码>