C++ rand()返回的int值高于我的max c++;

C++ rand()返回的int值高于我的max c++;,c++,random,C++,Random,所以我希望我不是在问一些愚蠢的问题 我想让我的程序在点击按钮时暂停2000到5999毫秒的随机数,以下是几行: void ExpNatDlg::OnBnClickedBack() { int delayRand; delayRand = (int)rand() % 6000 + 2000; Sleep(delayRand); } 为了检查我得到的延迟,我把它们打印在一个文件上,我不知道为什么,我有时会得到超过7000毫秒的延迟 我不知道我错过了什么!谢谢你的帮助 这是一个简单

所以我希望我不是在问一些愚蠢的问题

我想让我的程序在点击按钮时暂停2000到5999毫秒的随机数,以下是几行:

void ExpNatDlg::OnBnClickedBack()
{
   int delayRand;
   delayRand = (int)rand() % 6000 + 2000;
   Sleep(delayRand);
}
为了检查我得到的延迟,我把它们打印在一个文件上,我不知道为什么,我有时会得到超过7000毫秒的延迟


我不知道我错过了什么!谢谢你的帮助

这是一个简单的数学问题。rand()%6000给出从0到5999的结果。加上2000,结果是从2000到7999

问题是,
(int)rand()%6000
将位于5999之前的任何位置,因此当您添加2000时,您将超过阈值。 要获得2000和6000的最小值和最大值,需要使用
(int)rand()%4000+2000
。这是因为随机数将在0到3999的范围内生成,然后加上2000将得到2000到5999的范围

如果您有可用的c++11,您可以编写如下代码:

///init for RNG
std::random_device rd;
std::default_random_engine generator;
generator.seed( rd() );

//using the RNG
std::uniform_int_distribution<int> distribution(0,6000);
Sleep(distribution(generator));
///RNG的初始化
std::随机_装置rd;
std::默认随机引擎生成器;
种子(rd());
//使用RNG
标准:统一国际分布(06000);
睡眠(分配(发生器));

这里的好处是,随机数的质量更高,代码的意图更清晰。

延迟可能超过7000,因为8000是最大值。您使用的是c++11吗?如果是这样的话,你应该使用更新的随机数库函数。我认为形式
%n+m
意味着m是最小值,n是最大值。。。不是吗?不,我没有使用c++11
rand()
返回一个
int
结果。对
int
的强制转换是多余的。哦,好的!谢谢!另外,sleep()也不能保证那么准确。如果你让它睡眠7000ms,它至少会睡眠7000ms,如果机器正在运行许多其他进程,它可能会睡得更久。你知道更准确的睡眠()替代方法吗?
(int)rand()%4000
给你的数字范围是0到3999,而不是0到4000
(int)rand()%4000+2000
然后给出2000到5999之间的数字。@KeithThompson,修正