से छद्म-यादृच्छिक पूर्णांक उत्पन्न करना मैंने दिए गए अंतराल [lower, upper]
से यादृच्छिक पूर्णांक उत्पन्न करने के लिए निम्न श्रेणी लिखी।एक बदलते अंतराल से प्रभावी रूप से
class RandomInteger {
protected:
std::random_device randomDevice;
std::default_random_engine randomEngine;
std::uniform_int_distribution<> distribution;
public:
RandomInteger(int64_t lower, int64_t upper);
virtual ~RandomInteger();
virtual int64_t generate();
};
RandomInteger::RandomInteger(int64_t lower, int64_t upper) : randomEngine(this->randomDevice()), distribution(lower, upper) {
}
RandomInteger::~RandomInteger() {
// TODO Auto-generated destructor stub
}
int64_t RandomInteger::generate() {
int64_t i = this->distribution(this->randomEngine);
return i;
}
अगर अंतराल generate
के लिए एक ही है और कई कॉल किए जाते हैं रहता है यह ठीक है। हालांकि, अब मेरा उपयोग मामला अंतराल से पूर्णांक उत्पन्न कर रहा है जो हमेशा बदल रहा है (ऊपरी बाउंड हर बार बढ़ता है)।
सबसे पहले और सबसे महत्वपूर्ण, यह तेज़ होना चाहिए। क्रिप्टोग्राफी के साथ इसका कोई लेना-देना नहीं है, इसलिए बहुत छद्म-यादृच्छिक संख्या ठीक है (और std::random_device
शायद इसकी आवश्यकता नहीं है)। यदि संभव हो तो मैं सी शैली से बचना चाहूंगा और आधुनिक सी ++ 11 शैली का उपयोग करूंगा।
क्या आप इसे कुशलता से करने के तरीके सुझा सकते हैं?
क्या वितरण को पर्याप्त कुशल नहीं बदल रहा है? 'uniform_int_distribution' एक बहुत ही पतला आवरण है, वहां कोई महत्वपूर्ण ओवरहेड नहीं होना चाहिए। साथ ही, आपकी कक्षा 'वर्चुअल' में फ़ंक्शन क्यों हैं? –
@ कोनराड्रूडॉल्फ उन्हें वर्चुअल होने की आवश्यकता नहीं है। उन्हें यहां महत्वपूर्ण गतिशीलता में नॉनवर्टुअल परिणाम देगा? मैंने सीखा है कि वर्चुअल विधि कॉल के लिए ओवरहेड बहुत कम है। यह एक अजीब स्थिति है: सी ++ ओओपी भाषा होने का दावा करता है। ओओपी भविष्य में आपके कोड को विस्तारणीय और पुन: प्रयोज्य बनाने के बारे में बहुत कुछ है। हालांकि, कई सी ++ प्रोग्रामर लगातार दूसरों को ओओपी अक्षम करने की सलाह देते हैं (यानी विधियों को गैर-वर्चुअल बनाते हैं) जब तक कि अभी स्पष्ट रूप से आवश्यकता न हो। – clstaudt
@ कोनराड्रूडॉल्फ "वितरण को बदलना" का मतलब विभिन्न मानकों के साथ एक नया 'std :: uniform_int_distribution' को चालू करना होगा? – clstaudt