2011-09-28 7 views
6

Próbuję wysyłać sygnały między procesami i muszę pozwolić na losowe opóźnienie czasowe od 0,01 do 0,1 sekundy w pętli generowania sygnału. Tak właśnie robię i na pewno nie jest między 0,01 a 0,1, ale wychodzi jako 1 sekunda. Nie jestem pewien, czego tu brakuje.Losowe opóźnienie czasowe

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

Odpowiedz

0

Trzy rzeczy:

1) 100000L to 100 ms, a nie 10 ms

2) usleep jest gwarantowana tylko spać przynajmniej raz argumentów, bez gwarancji, o ile to będzie spać. Przeczytaj stronę podręcznika: wszystkie funkcje uśpienia tworzą to stwierdzenie.

3) Jak mierzysz ile czasu to trwa? Czy używasz timera z rozdzielczością milli lub mikrosekund?

1

Wszystkie twoje stałe są 10 razy za duże! Spróbuj

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

#facepalm! Dzięki! :) – Mia

11

Jeśli masz 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)}); 
} 

To nie może być to, co twój prof szuka. :-)

+0

Nigdy nie widziałem pustego <> w C++ ... czy możesz wyjaśnić, do czego służą? –

+0

@FelixDombek: do tworzenia szablonu zawierającego domyślne argumenty. Używane również, gdy w pełni wyspecyfikujesz szablon. –

+0

-1, a teraz za niedopowiedzenie roku: niepotrzebnie skomplikowane. – bobobobo

0

Najprościej jest wygenerować losową liczbę z zakresu od 0 do 1, a następnie użyć funkcji lerp, aby przenieść liczbę do wartości z zakresu od 0,01 do 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) ;