随机时间延迟

14

我试图在进程之间发送信号,而我需要在我的信号生成循环中允许0.01到0.1秒的随机时间延迟。所以这就是我正在做的事情,但它绝对不是在0.01到0.1之间,而是变成了1秒。不确定我错过了什么。

    sleepTime = 100000L+(long)((1e6-1e5)*rand()/(RAND_MAX+1.0));        
    usleep(sleepTime);
4个回答

30

如果你使用的是C++11:

#include <thread>
#include <random>
#include <chrono>

int main()
{
    std::mt19937_64 eng{std::random_device{}()};  // or seed however you want
    std::uniform_int_distribution<> dist{10, 100};
    std::this_thread::sleep_for(std::chrono::milliseconds{dist(eng)});
}

这可能不是您的教授所要寻找的。 :-)


我从未在C++中看到过空的<>...你能解释一下它们的作用吗? - Felix Dombek
2
@FelixDombek:用于实例化提供默认参数的模板。当您完全专门化一个模板时也会使用它。 - Jerry Coffin
-1,现在说一个轻描淡写的话:不必要的复杂。 - bobobobo
-1:这是我最近见过的最滑稽冗长的STL怪物。 - Foo Bah
5
+1,我认为这很棒,因为它重新利用了其他人写的数学内容。 - Felix Dombek
2
也许在2011年这太复杂了,但现在c++11在任何新编译器中都可用,这将是首选的方法。无论如何,这正是我正在寻找的。谢谢。 - Sean Lynch

1

你的所有常量都大了10倍!试试

 sleepTime = 10000L+(long)((1e5-1e4)*rand()/(RAND_MAX+1.0));  

0

最简单的方法是生成一个介于0和1之间的随机数,然后使用lerp函数将该数字移动到介于0.01和0.1之间。

// returns random between 0 and 1
float randFloat() ;

// you are "val" % of the way from min to max
float lerp( float val, float min, float max ) ; 

0
三件事:
1)100000L 是100毫秒,而不是10毫秒。
2)usleep只保证至少睡眠参数指定的时间,对于它实际睡眠多长时间没有保证。请阅读manpage:所有的睡眠函数都有这个声明。
3)你是如何测量所需时间的?你使用的计时器具有毫秒或微秒的分辨率吗?

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