मान लें कि आप C ++ <random>
सुविधाओं का उपयोग एक व्यावहारिक कार्यक्रम में करना चाहते हैं ("व्यावहारिक" की कुछ परिभाषा के लिए - यहाँ की बाधाएँ इस प्रश्न का एक प्रकार है)। आपको कोड इस तरह मिला है:
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
मेरा प्रश्न यह है कि आपको किस प्रकार का उपयोग करना चाहिए ENGINE
?
मैं हमेशा कहता
std::mt19937
था क्योंकि यह टाइप करने के लिए जल्दी था और नाम पहचान था। लेकिन इन दिनों ऐसा लगता है कि हर कोई कह रहा है कि मेर्सनी ट्विस्टर बहुत भारी है और कैश-अनफ्रेंडली है और वह सभी सांख्यिकीय परीक्षण भी पास नहीं करता है जो अन्य करते हैं।मैं कहना चाहूंगा
std::default_random_engine
क्योंकि यह स्पष्ट है "डिफ़ॉल्ट।" लेकिन मुझे नहीं पता कि यह प्लेटफॉर्म से प्लेटफॉर्म में बदलता है या नहीं , और मुझे नहीं पता कि यह सांख्यिकीय रूप से अच्छा है या नहीं।के बाद से हर कोई इन दिनों एक 64-बिट प्लेटफॉर्म पर है, हम कम से कम उपयोग करते हुए किया जाना चाहिए
std::mt19937_64
से अधिकstd::mt19937
?मैं कहना चाहता हूं
pcg64
याxoroshiro128
क्योंकि वे अच्छी तरह से सम्मानित और हल्के लगते हैं, लेकिन वे बिल्कुल भी मौजूद नहीं हैं<random>
।मैं इस बारे में कुछ पता नहीं है
minstd_rand
,minstd_rand0
,ranlux24
,knuth_b
निश्चित रूप से वे कुछ के लिए अच्छा होना चाहिए -, आदि?
जाहिर है कि यहां कुछ प्रतिस्पर्धी अड़चनें हैं।
इंजन की ताकत। (
<random>
कोई क्रिप्टोग्राफिक रूप से मजबूत PRNG नहीं है, लेकिन फिर भी, कुछ मानकीकृत लोग दूसरों की तुलना में "कमजोर" हैं, है ना?)sizeof
इंजन।इसकी गति
operator()
।बीजारोपण में आसानी।
mt19937
अच्छी तरह से बीज के लिए कुख्यात मुश्किल है क्योंकि यह आरंभ करने के लिए बहुत अधिक है।पुस्तकालय विक्रेताओं के बीच पोर्टेबिलिटी। यदि एक विक्रेता
foo_engine
दूसरे विक्रेता से अलग संख्या बनाता हैfoo_engine
, तो यह कुछ अनुप्रयोगों के लिए अच्छा नहीं है। (उम्मीद है कि इस नियम के अलावा कुछ भी नहीं हो सकता हैdefault_random_engine
।)
इन सभी बाधाओं को आप सबसे अच्छा कर सकते हैं, जो आप कहेंगे कि परम "सबसे अच्छा अभ्यास रहने के भीतर-मानक-पुस्तकालय" उत्तर क्या है? मैं बस का उपयोग कर रखना चाहिए std::mt19937
, या क्या?