2011-09-28 8 views
6

मैं प्रक्रियाओं के बीच सिग्नल भेजने की कोशिश कर रहा हूं और मुझे अपने सिग्नल जनरेशन लूप में 0.01 और 0.1 सेकंड के बीच यादृच्छिक समय देरी की अनुमति देने की आवश्यकता है। तो यही वह है जो मैं कर रहा हूं और यह निश्चित रूप से 0.01 और 0.1 के बीच नहीं है, लेकिन 1 सेकंड के रूप में आता है। यकीन नहीं है कि मैं यहाँ क्या खो रहा हूँ।यादृच्छिक समय देरी

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

उत्तर

0

तीन बातें:

1) 100000L 100 msec, नहीं है 10 msec

2) usleep केवल कम से कम तर्क समय के लिए सोने के लिए, के बारे में कोई गारंटी नहीं के साथ की गारंटी है कितना समय सो जाएगा। मैनपेज पढ़ें: सभी नींद के कार्य उस दावे को बनाते हैं।

3) आप कैसे माप रहे हैं यह कितना समय लगता है? क्या आप एक टाइमर का उपयोग कर रहे हैं जिसमें मिली या माइक्रोसॉन्ड रिज़ॉल्यूशन है?

1

आपके सभी स्थिरांक 10x बहुत बड़े हैं!

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

#facepalm! धन्यवाद! :) – Mia

11

प्रयास करें आप सी ++ 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)}); 
} 

यह नहीं हो सकता है कि आपके प्रोफेसर की तलाश में है। :-)

+0

मैंने सी ++ में खाली <> कभी नहीं देखा है ... क्या आप समझा सकते हैं कि वे क्या हैं? –

+0

@FelixDombek: डिफ़ॉल्ट टेम्पलेट प्रदान करने वाले टेम्पलेट को तत्काल करने के लिए। जब आप टेम्पलेट को पूरी तरह से विशेषज्ञ करते हैं तो भी इसका उपयोग किया जाता है। –

+0

-1, और अब वर्ष की कमी के लिए: अनावश्यक रूप से जटिल। – bobobobo

0

सबसे आसान बात 0 और 1 के बीच यादृच्छिक संख्या उत्पन्न करना सबसे आसान बात है, तोफ़ंक्शन का उपयोग करें ताकि संख्या 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) ;