2011-09-28 17 views
6

Sto cercando di inviare segnali tra processi e ho bisogno di consentire un ritardo casuale compreso tra 0,01 e 0,1 secondi nel mio loop di generazione del segnale. Quindi questo è quello che sto facendo e non è certamente tra 0,01 e 0,1, ma esce come 1 secondo. Non sono sicuro di cosa mi manchi qui.Ritardo casuale

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

risposta

0

Tre cose:

1) 100000L è di 100 msec, non 10 msec

2) usleep è garantito solo a dormire per almeno il tempo tesi, senza alcuna garanzia di quanto tempo ci dormirò. Leggi la pagina di manuale: tutte le funzioni del sonno fanno questa affermazione.

3) Come stai misurando quanto tempo ci vuole? Stai usando un timer con risoluzione milli o microseconda?

1

Tutte le tue costanti sono 10 volte troppo grandi! Prova

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

#facepalm! Grazie! :) – Mia

11

Se hai 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)}); 
} 

Potrebbe non essere ciò che il prof sta cercando. :-)

+0

Non ho mai visto vuoto <> in C++ ... puoi spiegare a cosa servono? –

+0

@FelixDombek: per creare un'istanza di un modello che fornisce argomenti predefiniti. Utilizzato anche quando si specializza completamente un modello. –

+0

-1, e ora per l'eufemismo dell'anno: inutilmente complesso. – bobobobo

0

La cosa più semplice è generare un numero casuale compreso tra 0 e 1, quindi utilizzare una funzione lerp per spostare il numero tra 0,01 e 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) ;