2011-09-28 12 views
6

Estoy tratando de enviar señales entre procesos y necesito permitir un retraso de tiempo aleatorio de entre 0.01 y 0.1 segundos en mi ciclo de generación de señal. Entonces esto es lo que estoy haciendo y ciertamente no está entre 0.01 y 0.1, pero sale como 1 segundo. No estoy seguro de lo que me falta aquí.Retardo de tiempo aleatorio

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

Respuesta

0

Tres cosas:

1) 100000L es 100 ms, no 10 mseg

2) usleep sólo se garantiza a dormir por lo menos el tiempo de discusión, sin ninguna garantía acerca de cuánto tiempo dormiré. Lea la página de manual: todas las funciones de sueño hacen esa afirmación.

3) ¿Cómo mide cuánto tiempo lleva? ¿Estás usando un temporizador que tiene una resolución de mili o microsegundos?

1

¡Todas sus constantes son 10 veces más grandes! Trate

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

#facepalm! ¡Gracias! :) – Mia

11

Si tienes 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)}); 
} 

Puede que no sea lo que su prof está buscando. :-)

+0

Nunca he visto empty <> en C++ ... ¿puedes explicar para qué sirven? –

+0

@FelixDombek: para crear instancias de una plantilla que proporciona argumentos predeterminados. También se usa cuando se especializa completamente en una plantilla. –

+0

-1, y ahora para la subestimación del año: innecesariamente complejo. – bobobobo

0

Lo más fácil es generar un número aleatorio entre 0 y 1, luego usar una función lerp para mover el número a entre 0.01 y 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) ; 
Cuestiones relacionadas