मैं 2015 में कला की स्थिति के संक्षिप्त अवलोकन के साथ एंग्री शूज़ और पियरचेन के उत्कृष्ट उत्तरों को पूरक करना चाहता हूं:
कुछ अच्छे विकल्प
randutils
randutils
पुस्तकालय (प्रस्तुति) एक दिलचस्प नवीनता, एक सरल अंतरफलक और (घोषित) मजबूत यादृच्छिक क्षमताओं करता है। इसके नुकसान यह है कि यह आपकी परियोजना पर निर्भरता को जोड़ता है और नए होने के नाते, इसका बड़े पैमाने पर परीक्षण नहीं किया गया है। वैसे भी, (MIT लाइसेंस) और हेडर-फ्री होने के नाते, मुझे लगता है कि यह एक कोशिश के लायक है।
न्यूनतम नमूना: एक डाई रोल
#include <iostream>
#include "randutils.hpp"
int main() {
randutils::mt19937_rng rng;
std::cout << rng.uniform(1,6) << "\n";
}
यहां तक कि अगर कोई पुस्तकालय में दिलचस्पी नहीं रखता है, तो वेबसाइट ( http://www.pcg-random.org/ ) सामान्य रूप से यादृच्छिक संख्या पीढ़ी के विषय और विशेष रूप से C ++ पुस्तकालय के बारे में कई दिलचस्प लेख प्रदान करती है।
Boost.Random
Boost.Random
(प्रलेखन) पुस्तकालय जो प्रेरित है C++11
's <random>
, जिनके साथ शेयरों में ज्यादा इंटरफ़ेस की। जबकि सैद्धांतिक रूप से भी एक बाहरी निर्भरता है, Boost
अब तक "अर्ध-मानक" पुस्तकालय की स्थिति है, और इसके Random
मॉड्यूल को अच्छी गुणवत्ता वाली यादृच्छिक संख्या पीढ़ी के लिए शास्त्रीय विकल्प माना जा सकता है। यह C++11
समाधान के संबंध में दो फायदे पेश करता है:
- यह अधिक पोर्टेबल है, बस C ++ 03 के लिए संकलक समर्थन की आवश्यकता है
- इसकी
random_device
पेशकश करने के लिए उपयोग करता है प्रणाली विशेष तरीकों अच्छी गुणवत्ता के बोने
एकमात्र छोटा दोष यह है कि मॉड्यूल की पेशकश random_device
हेडर-केवल नहीं है, किसी को संकलन और लिंक करना है boost_random
।
न्यूनतम नमूना: एक डाई रोल
#include <iostream>
#include <boost/random.hpp>
#include <boost/nondet_random.hpp>
int main() {
boost::random::random_device rand_dev;
boost::random::mt19937 generator(rand_dev());
boost::random::uniform_int_distribution<> distr(1, 6);
std::cout << distr(generator) << '\n';
}
जबकि न्यूनतम नमूना अपना काम अच्छी तरह से करता है, वास्तविक कार्यक्रमों को सुधार की एक जोड़ी का उपयोग करना चाहिए:
- बनाने के
mt19937
एक thread_local
: जनरेटर काफी मोटा है (> 2 KB) और बेहतर ढेर पर आवंटित नहीं किया गया है
mt19937
एक से अधिक पूर्णांक के साथ बीज : मर्सिएन ट्विस्टर के पास एक बड़ा राज्य है और इस संकलन के दौरान अधिक एन्ट्रापी का लाभ ले सकता है
कुछ नहीं तो अच्छा विकल्प
C ++ 11 पुस्तकालय
सबसे मुहावरेदार समाधान होते हुए भी, <random>
लाइब्रेरी बुनियादी जरूरतों के लिए भी अपने इंटरफेस की जटिलता के बदले में बहुत कुछ नहीं देती है। इसका दोष यह है std::random_device
: मानक अपने आउटपुट (जब तक entropy()
रिटर्न के रूप में 0
) के लिए किसी भी न्यूनतम गुणवत्ता को अनिवार्य नहीं करता है और 2015 तक, मिनग डब्ल्यू (सबसे अधिक उपयोग नहीं किया गया कंपाइलर, लेकिन शायद ही एक गूढ़ विकल्प) 4
न्यूनतम नमूने पर प्रिंट करेगा ।
न्यूनतम नमूना: एक डाई रोल
#include <iostream>
#include <random>
int main() {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(1, 6);
std::cout << distr(generator) << '\n';
}
यदि कार्यान्वयन सड़ा हुआ नहीं है, तो यह समाधान बूस्ट के बराबर होना चाहिए, और वही सुझाव लागू होते हैं।
गोडोट का समाधान
न्यूनतम नमूना: एक डाई रोल
#include <iostream>
#include <random>
int main() {
std::cout << std::randint(1,6);
}
यह एक सरल, प्रभावी और साफ समाधान है। केवल दोष, संकलन में कुछ समय लगेगा - लगभग दो साल, C ++ 17 को समय पर जारी किया गया है और प्रायोगिक randint
फ़ंक्शन को नए मानक में अनुमोदित किया गया है। शायद उस समय तक भी बोने की गुणवत्ता की गारंटी में सुधार होगा।
न्यूनतम नमूना: एक डाई रोल
#include <cstdlib>
#include <ctime>
#include <iostream>
int main() {
std::srand(std::time(nullptr));
std::cout << (std::rand() % 6 + 1);
}
पुराने सी समाधान को हानिकारक माना जाता है, और अच्छे कारणों के लिए (अन्य उत्तर यहां या इस विस्तृत विश्लेषण को देखें )। फिर भी, इसके फायदे हैं: यह सरल, पोर्टेबल, तेज और ईमानदार है, इस अर्थ में कि यह ज्ञात है कि जिस यादृच्छिक संख्या को प्राप्त किया जाता है वह शायद ही सभ्य हो, और इसलिए किसी को गंभीर उद्देश्यों के लिए उपयोग करने का प्रलोभन नहीं दिया जाता है।
लेखांकन ट्रोल समाधान
न्यूनतम नमूना: एक डाई रोल
#include <iostream>
int main() {
std::cout << 9; // http://dilbert.com/strip/2001-10-25
}
जबकि 9 एक नियमित डाई रोल के लिए कुछ असामान्य परिणाम है, किसी को इस समाधान में अच्छे गुणों के उत्कृष्ट संयोजन की प्रशंसा करनी होगी, जो सबसे तेज, सबसे सरल, सबसे कैश-फ्रेंडली और सबसे पोर्टेबल होने का प्रबंधन करता है। 9 को 4 के साथ प्रतिस्थापित करने से किसी भी प्रकार के डंगऑन और ड्रेगन के लिए एक सही जनरेटर हो जाता है, जबकि अभी भी प्रतीक-युक्त मूल्यों 1, 2 और 3 से बचा जाता है। केवल एक छोटा दोष यह है कि, दिलबर्ट के अकाउंटिंग ट्रॉल्स के बुरे स्वभाव के कारण, यह कार्यक्रम वास्तव में अपरिभाषित व्यवहार करता है।